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