3 0 0 0 1 0 1 1 0 0 3 0 2 2 1 0 1 1 1 0 5 0 1 2 3 1 0 0 2 3 1 0 0 0 3 1 0 0 0 0 2 0 0 0 0 0
3 2 4HintHint: sample one, as we know zty always solve problem 0 by costing 0 minute. So after solving problem 0, he can choose problem 1 and problem 2, because T01 >=0 and T02>=0. But if zty chooses to solve problem 1, he can not solve problem 2, because T12 < T01. So zty can choose solve the problem 2 second, than solve the problem 1.
#include<stdio.h> const int N = 1<<14; const int inf = 0xffffff; int k[N]; void init() { for(int i=1;i<N; i++) { int n=0; for(int s=0;(1<<s)<=i; s++) if((1<<s)&i) n++; k[i]=n; } } int main() { int n,map[14][14],dp[N][14],maxlen; init(); while(scanf("%d",&n)>0) { for(int i=0;i<n;i++) for(int j=0;j<n;j++) scanf("%d",&map[i][j]); for(int s=1;s<(1<<n);s++) for(int i=0;i<n;i++) dp[s][i]=inf; dp[1<<0][0]=0; maxlen=0; for(int s=1; s<(1<<n); s++) for(int i=0; (1<<i)<=s; i++) if(dp[s][i]!=inf) { if(maxlen<k[s])maxlen=k[s]; for(int j=0;j<n;j++) if(!((1<<j)&s)&&map[i][j]>=dp[s][i]&&dp[s|(1<<j)][j]>map[i][j]) dp[s|(1<<j)][j]=map[i][j]; } printf("%d\n",maxlen); } }
原文地址:http://blog.csdn.net/u010372095/article/details/41849705