3 75 15 21 75 15 28 34 70 5
188
#include<stdio.h>
#include<string.h>
#define mulit(i) (1<<(i))
#define ll int
#define N 16
ll dp[N][mulit(N)+1],sta[N][mulit(N)],sum[N][mulit(N)],sk[N],map[N][N];
void init(int n)
{
for(int i=0;i<n;i++)
{
sk[i]=0;
for(int j=0;j<mulit(n);j++)
{
int e; sum[i][sk[i]]=0;
for(e=0;mulit(e)<=j;e++)
if(mulit(e)&j)
{
sum[i][sk[i]]+=map[i][e];
if((mulit(e-1)&j)&&e>0)break;
}
if(mulit(e)>j)
{//printf("%I64d ",sta[i][sk[i]]);
sta[i][sk[i]]=j; sk[i]++;
}//
}
}
}
void count(int n)
{
memset(dp,0,sizeof(dp));
for(ll i=0;i<sk[0];i++)
dp[0][i]=sum[0][i];
for(ll i=1;i<n;i++)
for(ll j=0;j<sk[i];j++)
for(ll tj=0;tj<sk[i-1];tj++)
if((sta[i][j]&sta[i-1][tj])==0)//==优先级大于&
if(dp[i][j]<dp[i-1][tj]+sum[i][j])
dp[i][j]=dp[i-1][tj]+sum[i][j];
}
int main()
{
int n;
while(scanf("%d",&n)>0)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
scanf("%d",&map[i][j]);
init(n);
count(n);
ll max=0;
for(ll i=0;i<sk[n-1];i++)
if(dp[n-1][i]>max)
max=dp[n-1][i];
printf("%d\n",max);
}
}
原文:http://blog.csdn.net/u010372095/article/details/38852013