HDU - 1565 方格取数 状压DP

题意:

在n*n的格子里 取数 且 取得数两两不相邻,求最大的总和

求出一行当中满足两两不相邻的状态  ->  当前状态 & 当前状态左移一位, 如果结果为零则满足条件,否则不满足 存入st数组

例: 101, 1010  |   11, 110

然后 dp 处理一下

st[j] & st[k] == 0 保证竖直方向不相邻

dp[i][j] += dp[i-1][k]  + sum  dp[i][j] 表示第i行放第j个满足两两不相邻的状态时候能达到的最大值 sum 是 第j个状态 数的总和

 

AC 代码

#include
#include
#include
#include
#include
#include
#include
#include
#define INF 0x3f3f3f3f
#define rep(i,a,n) for(int i=a;i=a;i--)
#define fori(x) for(int i=0;i

typedef long long ll;
const int maxn=1e6+7;
const int mod=1e9+7;
const double eps=1e-8;
// const double pi = acos(-1);

using namespace std;

int a[22][22];
int dp[22][1<<22];
int st[1<<22];

int main()
{
    int n;
    while(sca(n)!=EOF)
    {
      rep(i,0,n)
      {
        rep(j,0,n)
        {
          sca(a[i][j]);
        }
      }
      int cnt = 0;
      rep(i,0,(1<


 

 

你可能感兴趣的:(DP)