洛谷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();
}

【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)的更多相关文章

  1. P1896 [SCOI2005]互不侵犯 状压dp

    正解:状压dp 解题报告: 看到是四川省选的时候我心里慌得一批TT然后看到难度之后放下心来觉得大概没有那么难 事实证明我还是too young too simple了QAQ难到爆炸TT我本来还想刚一道 ...

  2. 洛谷——P1896 [SCOI2005]互不侵犯

    P1896 [SCOI2005]互不侵犯 状压DP入门题 状压DP一般需要与处理状态是否合法,节省时间 设定状态dp[i][j][k]表示第i行第j个状态选择国王数为k的方案数 $dp[i][j][n ...

  3. 洛谷 P1896 [SCOI2005]互不侵犯

    洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...

  4. 洛谷P1896 [SCOI2005]互不侵犯King

    P1896 [SCOI2005]互不侵犯King 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共 ...

  5. BZOJ1087[SCOI2005]互不侵犯——状压DP

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入 只有一行,包含两个数N,K ( ...

  6. SCOI2005 互不侵犯 [状压dp]

    题目传送门 题目大意:有n*n个格子,你需要放置k个国王使得它们无法互相攻击,每个国王的攻击范围为上下左走,左上右上左下右下,共8个格子,求最多的方法数 看到题目,是不是一下子就想到了玉米田那道题,如 ...

  7. [SCOI2005]互不侵犯 (状压$dp$)

    题目链接 Solution 状压 \(dp\) . \(f[i][j][k]\) 代表前 \(i\) 列中 , 已经安置 \(j\) 位国王,且最后一位状态为 \(k\) . 然后就可以很轻松的转移了 ...

  8. 洛谷 P1896 [SCOI2005]互不侵犯 (状态压缩DP)

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 注:数据有加强(2018/4/25) ...

  9. 洛谷P1896 [SCOI2005]互不侵犯King【状压DP】

    题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8个格子. 输入格式: 只有一行,包含两个数N,K ...

随机推荐

  1. Idea 配置启动JDK___在windows中使用Intellij Idea时选择自定义的64位JVM

    略过下面的叙述快速配置 配置你的Idea启动jdk  (Idea15之后的版本启动不要JDK1.8) 添加环境变量IDEA_JDK_64,配置和JAVA_HOME环境变量相同,路径写到1.8的jdk就 ...

  2. java 中国网建实现发送短信验证码

    现在中国网建上注册一个自己的账户, 然后里面有代码案例,也有相应的下载jar包的地址 package com.direct.note; import java.io.IOException; impo ...

  3. VMWARE错误-"VirtualInfrastructure.Utils.ClientsXml"的类型初始值设定项引发异常

    异常信息:"VirtualInfrastructure.Utils.ClientsXml"的类型初始值设定项引发异常. 解决方案:以管理员的身份运行客户程序

  4. mysql创建用户授权

    服务器上好多库,为了不让某用户误操作别人的数据库,给他单独建个用户并授权. insert into mysql.user(Host,User,Password, ssl_cipher, x509_is ...

  5. xlwings: Write Excel macro using python instead of VBA

    i want to write Excel macros to deal with the data, but i am not familiar with VBA language. so i de ...

  6. 面试题Spring Boot

    Spring Boot 是微服务中最好的 Java 框架. 我们建议你能够成为一名 Spring Boot 的专家. 问题一 Spring Boot.Spring MVC 和 Spring 有什么区别 ...

  7. java面试题之----IO与NIO的区别

    JAVA NIO vs IO 当我们学习了Java NIO和IO后,我们很快就会思考一个问题: 什么时候应该使用IO,什么时候我应该使用NIO 在下文中我会尝试用例子阐述java NIO 和IO的区别 ...

  8. SQL Server ->> SQL Server 2016新特性之 -- Dynamic Data Masking

    Dynamic Data Masking是为了防止敏感数据暴露给未经授权的用户,以一种最小开销和维护成本的形式.Dynamic Data Masking用于表的字段,相当于盖住字段数据的一部分.比如一 ...

  9. python filter&sorted

    filter filter()接收一个函数和一个序列和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素在一个list中, ...

  10. Hibernate初探之一对多映射 及 myeclipse自动生成hibernate文件方法

    实现单向一对多: 1)在one方的实体中添加保存many方的集合 2)在one方的配置文件中添加<one-to-many>配置 实现单向多对一: 1)在many方的实体中添加one方的引用 ...