hdu 1565 方格取數(1)(狀態壓縮DP)
阿新 • • 發佈:2019-01-29
終於可以寫題解了。因為一個細節上的失誤,讓我重新修改的程式碼一直通不過測試,鬱悶。
程式碼毫無參考價值,剛學的狀態壓縮DP,程式碼寫得很難看。
#include<stdio.h> #include<string.h> #define N 21 int dp[1<<N],flag[N],mark[N][N],t[1<<N]; int n,st[1<<N],ss; int Max(int x,int y) { if(x>y) return x; return y; } void Init() { int i,j,k; k=1<<n; j=1; st[0]=0; for(i=0; i<k; i++) { if(!(i&(i<<1))) st[j++]=i; } ss=j; return ; } void Input() { int i,j; for(i=1; i<=n; i++) { flag[i]=(1<<n)-1; for(j=1; j<=n; j++) scanf("%d",&mark[i][j]); } return ; } int judge(int x,int y) { if((x&flag[y])!=x) return 1; return 0; } void Output() { int i,j,k; memset(dp,0,sizeof(dp)); memset(t,0,sizeof(t)); for(i=1; i<=n; i++) { for(j=0; j<ss; j++) { if(judge(st[j],i)) continue; int temp=0; for(k=1; k<=n; k++) { int ttt=st[j]>>(n-k); if(ttt&1) temp+=mark[i][k]; } for(k=0; k<ss; k++) { if((st[k]&st[j])==0) dp[st[j]]=Max(dp[st[j]],t[st[k]]+temp); } } for(j=0; j<ss; j++) t[st[j]]=dp[st[j]]; } int max=0; for(i=0; i<ss; i++) max=Max(max,dp[st[i]]); printf("%d\n",max); return ; } int main() { while(scanf("%d",&n)!=EOF) { if(n==0) { printf("0\n"); continue; } Init(); Input(); Output(); } return 0; }