状态压缩 HDU 1565
生活随笔
收集整理的這篇文章主要介紹了
状态压缩 HDU 1565
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
多組數據
給你一個n*n的矩陣
不能相鄰的取數 上下左右
求最大的和
#include<stdio.h> #include<algorithm> #include<string.h>using namespace std;int n; int z[30][30]; int dp[2][1<<20+1],cnt; //dp和滾動數組差不多 推出的行只有相鄰的有關系 int num[20000]; //用來記錄 合法的狀態 就是同行要不相鄰int main() {cnt=0;for(int i=0;i<(1<<20);i++)if((i&(i<<1))==0)num[cnt++]=i;while(scanf("%d",&n)!=EOF){for(int i=0;i<n;i++)for(int j=0;j<n;j++)scanf("%d",&z[i][j]);memset(dp,0,sizeof(dp));int len=(1<<n);for(int i=0;i<n;i++){int p=i&1; //奇數偶數for(int j=0;j<cnt;j++){if(num[j]>=len)break;int sum=0;for(int k=0;k<n;k++) //和這個狀態都是1 可以取{if((num[j]&(1<<k)))sum+=z[i][k];}int m1=0;for(int k=0;k<cnt;k++){if(num[j]>=len)break;if(!(num[j]&num[k])) //上面最大的合法的狀態轉移過來m1=max(m1,dp[1-p][num[k]]);}dp[p][num[j]]=sum+m1; //本行加上面的}}int p=(n-1)&1; //最后奇偶int ans=0;for(int i=0;i<len;i++) //最大的狀態ans=max(dp[p][i],ans);printf("%d\n",ans);}return 0; }?
轉載于:https://www.cnblogs.com/cherryMJY/p/6128743.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的状态压缩 HDU 1565的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Angular模态框
- 下一篇: 预备作业02-20162314王译潇 黑