文章

99

粉丝

120

获赞

8

访问

96.9k

头像
状态压缩
备考心情
发布于2024年8月26日 10:06
阅读数 941

给你一个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]的收益 
     ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发