这个题再次犯了没有初始化的毛病,但是样例居然只有第2组不对,其他的都对。。。而且还没法调试。。。。。
这个题还是很简单的状压。还是把每一行的状态都先预处理出来。然后从第一行往下不断进行状态转移。为了不TLE,应该把每种状态下的和也预处理出来。
代码如下:
#include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include <set> #include <stdio.h> using namespace std; #define LL __int64 #define pi acos(-1.0) const int mod=100000000; const int INF=0x3f3f3f3f; const double eqs=1e-8; int dp[20][1<<16], a[1<<16], top, tot, num[16][1<<16]; int mp[20][20]; void init(int n) { top=0; int i, j; for(i=0;i<tot;i++){ if(!(i&(i<<1))) a[top++]=i; } } int main() { int n, m, i, j, x, max1, k, h; char c; while(scanf("%d",&mp[0][0])!=EOF){ n=1; c=getchar(); while(c!='\n'){ scanf("%d",&mp[0][n++]); c=getchar(); } for(i=1;i<n;i++){ for(j=0;j<n;j++){ scanf("%d",&mp[i][j]); } } tot=1<<n; init(n); memset(num,0,sizeof(num)); for(i=0;i<n;i++){ for(j=0;j<top;j++){ for(k=0;k<n;k++){ if(a[j]&(1<<k)){ num[i][j]+=mp[i][k]; } } } } memset(dp,0,sizeof(dp)); max1=0; for(i=0;i<top;i++){ dp[0][i]=num[0][i]; max1=max(max1,dp[0][i]); } for(i=1;i<n;i++){ for(j=0;j<top;j++){ for(k=0;k<top;k++){ if((a[j]&a[k])||(a[k]&(a[j]<<1))||(a[j]&(a[k]<<1))) continue ; dp[i][j]=max(dp[i][j],dp[i-1][k]+num[i][j]); } max1=max(max1,dp[i][j]); } } printf("%d\n",max1); } return 0; }
原文地址:http://blog.csdn.net/scf0920/article/details/42586561