题意:容易理解。
分析:这是我做的状态压缩第二题,一开始超内存了,因为数组开大了,后来超时了,因为能够成立的状态就那么多,所以你应该先把它抽出来!!总的来说还是比较简单的!!
代码实现:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; int n; int dp[2][(1<<20)+10],map[25][25],a[20000],num; void chushihua() { int max=1<<20,i; for(i=0;i<max;i++) if((i&(i<<1))==0) a[num++]=i; } int qiu(int r,int flag) { int i,x=1<<(n-1),sum=0; for(i=1;i<=n;i++) { if((x&flag)!=0) sum=sum+map[r][i]; x=x>>1; } return sum; } void solve() { int i,j,k,max,res=0,temp,p=0; 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++) { for(k=0;k<num&&a[k]<max;k++) { if((a[j]&a[k])!=0) continue; temp=qiu(i,a[j]); if(dp[p][a[j]]<(temp+dp[1-p][a[k]])) dp[p][a[j]]=temp+dp[1-p][a[k]]; } } } for(i=0;i<num&&a[i]<max;i++) if(res<dp[p][a[i]]) res=dp[p][a[i]]; printf("%d ",res); } int main() { int i,j; num=0; chushihua();//把所有的可能状态抽出来 while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) for(j=1;j<=n;j++) scanf("%d",&map[i][j]); solve(); } return 0; }