light oj 1011Marriage Ceremonies
总结状压dp板子。
强迫症预处理,多写了几行但非常快
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; const int maxn=16; int dp[1<<maxn],bp[1<<maxn]; int mp[maxn+4][maxn+4]; struct fuck{ int a[1<<maxn]; int idx; }f[18]; int getnum(int x) { int ans=0; while(x>0) { if(x&1) ans++; x>>=1; } return ans; } void init() { int m=1<<maxn; int i,j; for(i=1;i<=16;i++) f[i].idx=0; for(i=1;i<m;i++) { j=getnum(i); f[j].a[f[j].idx++]=i; } } int main() { int i,j,n,m,t; scanf("%d",&t); init(); int cas=1; while(t--) { scanf("%d",&n); for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&mp[i][j]); memset(dp,0,sizeof(dp)); int len=(1<<n); int k; for(i=1;i<=n;i++) { for(j=0;j<f[i].idx;j++) { if(f[i].a[j]>=len) break; for(k=0;k<n;k++) { int sb=(1<<k); if(f[i].a[j]&sb) dp[f[i].a[j]]=max(dp[f[i].a[j]],dp[f[i].a[j]|sb]+mp[i][k+1]); } } } printf("Case %d: %d\n",cas++,dp[(1<<n)-1]); } return 0; }