您的位置:首页 > 其它

HDU 1565 方格取数(1) (状态dp)

2014-04-20 12:08 253 查看
OJ题目:click here ~~

数不相邻,使得总和最大。

AC_CODE

int grid[20][20] , dp[21][17800];
int n;

vector<int> states;
inline int MAX(int x , int y)
{
return x > y ? x : y;
}

int sum(int row , int x)
{
int ret = 0;
for(int i = 0;i < n;i++)
{
if(x&(1<<i)) ret += grid[row][i];
}
return ret;
}

int main()
{
states.clear();
for(int i = 1;i < (1<<20);i++)//枚举第0行的状态
{
if(i&(i<<1)) continue;
states.push_back(i);
}
while(scanf("%d",&n) != EOF)
{
if(n == 0)
{
printf("0\n");
continue;
}
int i , j , k , row;
for(i = 0;i < n;i++)
for(j = 0;j < n;j++)
scanf("%d" , &grid[i][j]);
memset(dp , 0 , sizeof(dp));
for(i = 0;states[i] < (1<<n);i++)//枚举第0行的状态
{
dp[0][i] = sum(0 , states[i]);
}

for(row = 1;row < n;row++)//从第1行开始
{
for(i = 0;states[i] < (1<<n);i++)//枚举本行的状态
{
for(j = 0;states[j] < (1<<n);j++)//枚举上一行的状态
{
if(states[i]&states[j]) continue;
dp[row][i] = MAX(dp[row][i] , dp[row - 1][j] + sum(row , states[i]));
}
}
}
int ans = -1;
for(i = 0;states[i] < (1<<n);i++)
ans = Max(ans , dp[n-1][i]);
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: