/*****
第一道状态压缩,感觉有点了解这个思维
*****/
#include<iostream>
#include<cstring>
using namespace std;
const int len = 20;
int state[ (1<<20) + 8];
int dp[2][ (1<<20) + 8];
int map[25][25];
int num = 0;
void init()
{
for(int i=0;i<(1<<20);i++)
if(!(i & (i << 1)))
state[num++] = i;
}
int n;
int sum(int s,int x)
{
int ans = 0;
for(int i=0;i<n;i++)
if((1<<i)&x)ans+=map[s][i];
return ans;
}
int main()
{
init();
while(cin >> n)
{
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin >> map[i][j];
int Max = -1;
memset(dp,0,sizeof(dp)); //想不懂这个为什么要初始化
for(int i=0;state[i]<(1<<n);i++)
dp[0][state[i]] = sum(0,state[i]);
for(int i=1;i<n;i++)
for(int j=0;state[j]<(1<<n);j++){ // 枚举所有的情况
Max = -1;
for(int k=0;state[k]<(1<<n);k++) // 枚举上一个状态
if(!(state[j]&state[k]))
{
int x = dp[(i+1)&1][state[k]];
if(x > Max) Max = x;
}
dp[i&1][state[j]] = Max + sum(i,state[j]);
}
int x = n-1;
for(int j=0;state[j]<(1<<n);j++)
Max = max(dp[x&1][state[j]],Max);
cout << Max<<endl;
}
}
HDU1565 状态压缩dp
最新推荐文章于 2018-10-11 11:47:29 发布