点击打开链接
题意:
给你一个n*n的矩阵,每个位置有一个非负数,在矩阵中取数字,要求,取的数字,不能相邻。。
用网络流做的话0ms.
#include"stdio.h" #include"string.h" #define N 21 int state[1<<15]; int top,n,map[N][N]; int dp[2][1<<15]; int t[N][1<<15]; int ok(int x) { if(x&(x<<1))return 0; return 1; } void init() { int i,j,k; top=0; for(i=0;i<(1<<n);i++) if(ok(i))state[top++]=i; memset(t,0,sizeof(t)); for(i=0;i<n;i++) { for(j=0;j<top;j++) { t[i][j]=0; int sum=0; for(k=0;k<n;k++) { if(state[j]&(1<<k))sum+=map[i][k]; } t[i][j]=sum; } } } int max(int x,int y) { return x>y?x:y; } int main() { int i,j,k; while(scanf("%d",&n)!=-1) { for(i=0;i<n;i++) { for(j=0;j<n;j++) scanf("%d",&map[i][j]); } init(); int ans=0; for(i=0;i<top;i++) { dp[0][i]=t[0][i]; if(ans<dp[0][i])ans=dp[0][i]; } for(i=1;i<n;i++) { for(j=0;j<top;j++) { dp[i%2][j]=0; for(k=0;k<top;k++) { if(state[j]&state[k])continue; dp[i%2][j]=max(dp[(i+1)%2][k]+t[i][j],dp[i%2][j]); } if(dp[i%2][j]>ans)ans=dp[i%2][j]; } } printf("%d\n",ans); } return 0; }