hdu 2602 Bone Collector
来源:互联网 发布:淘宝收藏宝贝 编辑:程序博客网 时间:2024/04/20 14:02
最普通不过de背包:#include<iostream>#include<stdio.h>using namespace std;int num[20000];int dp[2][20000];int a[20][20];int n;void dfs(int deep,int tot){ for ( int i = deep ; i < n ; i ++ ) { num[0]++; num[num[0]]=tot+(1<<i); dfs(i+2,num[num[0]]); }}int ff(int i,int j){ /*int k=0,total=0,g=j; while(g/2!=0||g%2==1) { g=g/2; k=k+1; } while(j/2!=0||j%2==1) { k--; if(j%2==1) total+=a[i][k]; j=j/2; } */ int k=-1 , total = 0 ; while ( j>0) { k++; if ( j&1 ) total+=a[i][k]; j=j/2; } return total;}int main(){ while(cin>>n) { num[0]=1; num[1]=0; dfs(0,0); for(int i=0;i<n;i++) for(int j=0;j<n;j++) { cin>>a[i][j]; } if(n==1) { cout<<a[0][0]<<endl; continue;} for(int i=1;i<=num[0];i++) { dp[0][i]=0; dp[1][i]=0; } //cout<<ff(0,5)<<endl; for(int i=1;i<=num[0];i++) for(int j=1;j<=num[0];j++) { if(((num[i] & num[j])==0) &&((ff(0,num[i])+ff(1,num[j]))>dp[1][j]))//{ dp[1][j]=ff(0,num[i])+ff(1,num[j]); // cout<<num[i]<<" "<<num[j]<<" "<<dp[1][j]<<endl;} } int pre=0,now=1; for(int i=2;i<n;i++) { pre=(pre+1)%2; now=(now+1)%2; for(int j=1;j<=num[0];j++) { for(int k=1;k<=num[0];k++) { if(j==1) dp[now][k]=0; if(((num[j] & num[k])==0)&&(dp[pre][j]+ff (i,num[k])>dp[now][k])) dp[now][k]=dp[pre][j]+ff(i,num[k]); } } } int ans=0; for(int i=1;i<=num[0];i++) { if(dp[now][i]>ans) ans=dp[now][i]; } cout<<ans<<endl; } }