#include <stdio.h>
#include <string.h>
int dp[3][1<<20];
int map[21][21];
int stk[20000];
int n,top;
bool isok(int x)
{
if(x&(x<<1)) return 0;
return 1;
}
void Init()
{
top=0;
for(int i=1;i<=((1<<n)-1);i++)
{
if(isok(i))
{
stk[++top]=i;
}
}
// for(int i=1;i<=top;i++)
// printf("%d ",stk[i]);
// printf("%d\n",top);
}
int value(int i,int s)
{
int sum=0;
int j=0;
while(s)
{
if(s&1)
sum+=map[i][n-j];
s=(s>>1);
j++;
}
return sum;
}
int max(int x,int y)
{
if(x>y) return x;
return y;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
Init();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&map[i][j]);
memset(dp,0,sizeof(dp));
//printf("%d++\n",value(1,4));
int ans=0;
for(int i=1;i<=top ;i++)
{
dp[1][i]=value(1,stk[i]);
ans=max(ans,dp[1][i]);
}
/*
for(int i=1;i<=top;i++)
{
printf("%d ",stk[i]);
printf("%d\n",dp[1][i]);
}
*/
for(int i=2;i<=n;i++)
{
for(int s=1;s<=top;s++)
{
for(int k=1;k<=top;k++)
{
if(stk[s]&stk[k])continue;
dp[i%2][s]=max(dp[i%2][s],dp[(i-1)%2][k]+value(i,stk[s]));
ans=max(dp[i%2][s],ans);
}
}
}
printf("%d\n",ans);
}
return 0;
}
hdu 1565 方格取数(1)(状态压缩dp)
最新推荐文章于 2019-02-14 21:26:31 发布