洛谷P1896:https://www.luogu.org/problemnew/show/P1896

前言

这是一道状压DP的经典题

原来已经做过了 但是快要NOIP 复习一波

关于一些位运算的知识点参考:

https://blog.csdn.net/fox64194167/article/details/20692645

思路

看数据识算法系列

我们用f[i][j][k]来表示第i行为状态j 并且前i行已经放了k个国王

对于状态我们可以先预处理出来

因为每个格子有放和不放两种选择

那么我们可以想到转化为二进制来区分他们的状态

如果有放为1 没放为0

因此状态最多可以达到2n种(每个格子都放)

所以我们预处理出所有的状态 之后在进行DP详细的判断即可

代码

#include<iostream>
using namespace std;
#define ll long long
ll f[][][];
ll ans;
int num[],s[],n,k,cnt;//num为每种状态可以防止的国王数
//s为状态
void pre()
{
for(int i=;i<(<<n);i++)//枚举所有状态
{
if(i&(i<<)) continue;//如果冲突了 就跳过
//这里可以看成同一行里连着放了2个不满足
int sum=;//国王数
for(int j=;j<n;j++)//统计此状态放置的国王的个数
if(i&(<<j)) sum++;//有放则为1
s[++cnt]=i;//添加状态
num[cnt]=sum;//统计国王数
}
}
void dp()
{
f[][][]=;//初始化
for(int i=;i<=n;i++)//枚举行
for(int j=;j<=cnt;j++)//枚举此行状态
for(int sum=;sum<=k;sum++)//枚举前i行的国王数
{
if(sum>=num[j])//如果前i行的国王数大于这种状态要放的国王数
//说明可以用这种状态
{
for(int t=;t<=cnt;t++)//枚举第i-1行的状态
{
if(!(s[t]&s[j])&&!(s[t]&(s[j]<<))&&!(s[t]&(s[j]>>)))
//无冲突
f[i][j][sum]+=f[i-][t][sum-num[j]];//加上之前的方案
}
}
}
for(int i=;i<=cnt;i++) ans+=f[n][i][k];//ans为第n行已经放完所有国王的所有状态的累计
cout<<ans;
}
int main()
{
cin>>n>>k;
pre();//预处理
dp();
}

最新文章

  1. SSO之CAS单点登录实例演示
  2. 使用NHibernate(10) -- 补充(inverse &amp;&amp; cascade)
  3. ini 文件操作记要(1): 使用 TIniFile
  4. 2016年12月8日 星期四 --出埃及记 Exodus 21:3
  5. C++转义字符使用
  6. 国外程序员整理的 C++ 资源大全
  7. DATABASE LINK 的查看、创建与删除
  8. hdu 4052 线段树扫描线、奇特处理
  9. 判断是否引入jQuery,没有则引入
  10. WCF学习笔记一之通过配置web.config可以通过http访问接口
  11. Java定时线程池停止超时任务
  12. [Guitar self-practising] 【吉他练习王-节奏练习】曲目1 基本扫弦节奏练习
  13. awk和sed
  14. Android 网络请求超时处理方案
  15. ZOJ 3203 灯泡
  16. img的src不连接本地地址实现输出一个图片(使用base64)
  17. jquery日期时间控件
  18. 防火墙在setup进入不了
  19. tab标签
  20. p12转pem公钥私钥

热门文章

  1. 冒泡排序&mdash;&mdash;Python实现
  2. 基数排序&mdash;&mdash;Java实现
  3. svn 未提交的显示黑色的星*
  4. python简单的爬虫
  5. bzoj2119 [ZJOI2010]base基站选址
  6. winform判断chrome是否正在最前端运行
  7. Windows系统中Oracle11g R2 版本数据库卸载
  8. Python学习---重点模块之re
  9. 华为HCNP实验 防火墙安全区域及安全策略配置(USG6000)
  10. Java实现的有道云笔记图片批量下载工具