提交时间:2022-07-19 11:53:25

运行 ID: 52331

#include<cstdio> #include<iostream> using namespace std; const int N=8005,M=4405; int n,m,k[M],c[N][M],ans; int dp[M][1<<15]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d",&k[i]); for(int j=1;j<=k[i];j++) scanf("%d",&c[i][j]),c[i][j]--; } for(int i=1;i<=m;i++) for(int s=0;s<(1<<n);s++) { dp[i][s]=max(dp[i][s],dp[i-1][s]); for(int j=1;j<=k[i];j++) { if(s&(1<<c[i][j])) continue; for(int l=j+1;l<=k[i];l++) { if(s&(1<<c[i][l])) continue; dp[i][s|(1<<c[i][j])|(1<<c[i][l])]=max(dp[i][s|(1<<c[i][j])|(1<<c[i][l])],dp[i-1][s]+1); } } } for(int i=0;i<(1<<n);i++) ans=max(ans,dp[m][i]); printf("%d",ans); return 0; }