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