小国王(状压dp经典题)

简介: 小国王(状压dp经典题)
#include <bits/stdc++.h>
using namespace std;
int n, m;
const int N = 15;
long long dp[N][1100][1 << 13]; //目前的行 选了多少个 目前状态
vector<int>v;//每行压缩航的合法状态
int check(int x)
{
  int res = 0;
  for (int i = 0; i <= 31; i++)
  {
    if (x >> i & 1) res++;
  }
  return res;
}
int main()
{
  cin >> n >> m;
  int ans = 0;
  for (int i = 0; i < (1 << n); i++)
  {
    if ((i & (i << 1)) == 0)
    {
      v.push_back(i);
    }
  }
  int len = v.size();
  //for(int i=0;i<len;i++)
  //dp[1][check(v[i])][i]=1;
  dp[0][0][0] = 1;
  for (int i = 1; i <= n + 1; i++)
  {
    for (int l = 0; l <= m; l++)
      for (int j = 0; j < len; j++)
      {
        for (int k = 0; k < len; k++)
        {
          if (v[j]&v[k]) continue;
          int t = v[j] | v[k];
          if (t & (t << 1)) continue;
          if (l - check(v[j]) < 0) continue;
          dp[i][l][j] += dp[i - 1][l - check(v[j])][k];
        }
      }
  }
  cout << dp[n + 1][m][0] << endl;
}
蔡珏
+关注
目录
打赏
0
0
0
0
2
分享
相关文章
|
9月前
|
力扣经典150题第三十八题:生命游戏
力扣经典150题第三十八题:生命游戏
83 0
【经典笔试题2】
首先分析代码,a是数组名,是数组首元素地址,&a取到整个数组的地址,+1跳过了整个数组,a强转成int*类型,然后赋值给ptr,此时ptr指向的就是数组a后面的地址,如下图:
国庆七天乐,要猛! ——经典迷宫问题
国庆七天乐,要猛! ——经典迷宫问题
99 0
【每日算法Day 82】面试经典题:求第K大数,我写了11种实现,不来看看吗?
【每日算法Day 82】面试经典题:求第K大数,我写了11种实现,不来看看吗?
120 0
一个古老而又经典的算法-汉诺塔问题
哈诺塔问题相信只要学习计算机的人都知道。这是一个古老而又伟大的问题。在这篇文章中,主要是给出递归解决汉诺塔问题的代码方法。毕竟面试的时候,HR比我们要变态很多,怎么蹂躏我们怎么玩。
285 0
一个古老而又经典的算法-汉诺塔问题
运筹学中的经典动态规划
运筹学中的经典动态规划
214 0
外行朋友值得一读的5本经典数学书
有很多人让我给外行朋友推荐一些优秀的数学书,他们之中有些是没在大学学过高等课程的,只对学习数学感兴趣的朋友,还有些对历史人物比对数学成果更感兴趣。具有讽刺意味的是,当你是滑铁卢大学数学专业的学生之后,你到第四年才有机会上一门讲述数学历史的课程,会向你解释一些隐藏在数学之后的心态和哲学,而非只是定理和证明。
296 0
外行朋友值得一读的5本经典数学书
重拾C++经典笔试30题(1-10)
解读:baseClass类包含1个虚函数表指针(4个字节)、1个int型数据成员(4个字节)、1个char型数据(对齐后4个字节)成员,共12个字节。 midClass1同midClass2一致,需要在baseClass类的基础上,多了1个虚函数表指针(4个字节)、1个指向虚基类表的指针(4个字节)、一个整形数据成员(4个字节),合计共12+12 =24个字节。 derivedClass 在上述的基础上,包含baseClass(12个字节)、midClass1(新增12个字节)、midClass2(新增12个字节)、derivedClass的1个整形数据成员(4个字节),合计共4
171 0