文章
99
粉丝
120
获赞
8
访问
96.9k
给你一个n*n的格子的棋盘,每个格子里面有一个非负数。
从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。
#include <iostream>
using namespace std;
#define max(a,b) (((a)>(b))?(a):(b))
int a[19][19], dp[19][1 << 17], vector[1 << 17], n, cnt = 1;
int ji(int i, int k)//第i行状态为k
{
int ans = 0, cnt = n;
while (k) {
if (k & 1) ans += a[i][cnt];//最后一位是1,加上
k >>= 1; cnt--;
}
return ans;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) cin >> a[i][j];
for (int i = 0; i < (1 << n); i++)
{
if (i & (i << 1)) continue;//不合法
if (i & (i >> 1)) continue;//不合法
vector[cnt++] = i;//储存状态
}
int maxn = 0;
for (int i = 1; i <= n; i++)//枚举行数
{
for (int j = 1; j < cnt; j++)//枚举事先储存在vector中的状态
{
int val = ji(i, vector[j]);//计算第i行状态vector[j]的收益
...
登录后发布评论
暂无评论,来抢沙发