题意:给你一个矩阵,让你在矩阵中找一些元素使它们加起来和最大,但是当你使用某一个元素时,那么这个元素周围的其它八个元素都不能取!
分析:这是一道比较基础的状态压缩题,也是我做的第三道状态压缩的题,但是这个题目的输入确实让我很无语,开始的时候wa一次,后来改成了超时,最后还是参照别人的输入ac的!
代码实现:
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int n,map[20][20],dp[2][(1<<15)+10]; int a[20000],num; void chushihua() { int i,max=1<<15; for(i=0; i<max; i++) if((i&(i<<1))==0) a[num++]=i; } int qiu(int r,int flag) { int i,sum=0,x=1<<(n-1); for(i=1; i<=n; i++) { if((flag&x)!=0) sum=sum+map[r][i]; x=x>>1; } return sum; } void solve() { int res=0,i,j,k,p=0,max,temp; max=1<<n; memset(dp,0,sizeof(dp)); for(i=1; i<=n; i++) { p=p^1; memset(dp[p],0,sizeof(dp[p])); for(j=0; j<num&&a[j]<max; j++) { temp=qiu(i,a[j]); for(k=0; k<num&&a[k]<max; k++) { if(((a[j]&a[k])==0)&&(((a[j]<<1)&a[k])==0)&&(((a[j]>>1)&a[k])==0)) { if(dp[p][a[j]]<(temp+dp[1-p][a[k]])) dp[p][a[j]]=temp+dp[1-p][a[k]]; if(res<dp[p][a[j]]) res=dp[p][a[j]]; } } } } printf("%d ",res); } int main() { char ch[1000],temp; num=0; chushihua(); while(gets(ch)) { int i , j ; i = 0 ; do { if(ch[0] == 0) break ; int len = strlen(ch); j = 0 ; i++ ; for(int c=0; c<len; c++) { if(ch[c] == ' ') continue ; j++ ; map[i][j] = 10*(ch[c]-'0') + ch[c+1]-'0' ; c++ ; } } while(gets(ch)!=NULL) ; n = i ; solve(); } return 0; }