hdu 1565 状态压缩dp

来源:互联网 发布:网络情歌对唱 编辑:程序博客网 时间:2024/05/17 01:09
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;


int dp[20][5000],num,A[5000],mark[25][5000],n,map[25][25];
int max(int a,int b)
{
return a>b?a:b;
}
int first()
{    
num=0;
int a,j,i;
for(i=0;i<(1<<n);i++)
{   
if(i&(i<<1)) continue;
A[num++]=i;
if(i==0) continue;
a=i;
j=n;
while(a/2)
{
if(a%2)
{
for(int k=1;k<=n;k++)
mark[k][num-1]+=map[k][j];
}
a/=2;
j--;
}
for(int k=1;k<=n;k++)
mark[k][num-1]+=map[k][j];
}
return 0;
}
int main()
{
int i,j,a;
while(~scanf("%d",&n))
{
memset(A,0,sizeof(A));
memset(mark,0,sizeof(mark));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
first();
//for(i=0;i<num;i++)
//printf("%d ",A[i]);
//printf("%\n");
memset(dp,0,sizeof(dp));
for(i=0;i<num;i++)
{
//int t=A[i];
//printf("%d ",t);
//printf("%d\n",mark[1][t]);
dp[1][i]=mark[1][i];
}
for(i=2;i<=n;i++)
{
for(j=0;j<num;j++)
{
for(int k=0;k<num;k++)
{
if(A[j]&A[k]) continue;
dp[i][k]=max(dp[i][k],dp[i-1][j]+mark[i][k]);
}
}
}
int Max=0;
for(i=0;i<num;i++)
if(dp[n][i]>Max) Max=dp[n][i];
printf("%d\n",Max);
}
return 0;
}
0 0
原创粉丝点击