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;    }     }

原创粉丝点击