[HOJ2662]Pieces Assignment<状态压缩dp>
描述:
有一个n*m的棋盘(n、m≤80,n*m≤80)要在棋盘上放k(k≤20)个棋子,使得任意两个棋子不相邻(每个棋子最多和周围4个棋子相邻)。求合法的方案总数。
输入:
本题有多组测试数据,每组输入包含三个正整数n,m和k。
输出:
对于每组输入,输出只有一个正整数,即合法的方案数。
样例输入:
2 2 3
4 4 1
样例输出:
0
16
【思路】
正常的想法是dp,一般的定义是dp[i][j]表示前i行放j个的方案数。。。
当然这种定义并不能储存状态,我们可以用状态压缩dp来实现;
这是一个棋盘,我们可以把放棋子理解为1,不放为0,那么一行就是由0,1组成,这些0,1在一起就是一个二进制数,即我们可以把每一行都转成十进制表示,而这个十进制的二进制就对应着这行的状态
dp定为dp[i][j][k]表示在前i行已经放了j个棋子,当前这一行放的状态是k,一个数字k表示着一种合法的放置方式
【步骤】
一开始先预处理第一行可以怎么放
因为不能两两相挨着,所以单独放一行的时候,这个二进制x&(x<<1)必须为0,假设x为10101,x<<1就是101010,&起来就是0,x就是合法的,记录到一个新的数组里
然后就是枚举行,总的个数,上一行的状态x,当前行的状态y
如果x状态和y状态&运算后==0并且j>=num(mark[x])//枚举的个数大于等于x状态下的棋子个数
dp[i][j][x]+=dp[i-1][j-num(x)][y];
最后再把第i行放k个的所有状态加起来就是ans了
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#define maxn 260
#define LL long long
using namespace std; LL dp[][][<<];//到第i行时填了j个,第i行是填第k种状态
int n,m,k;
LL ans,tot,mark[maxn]; int num(int x){
int su=;
while(x){
if(x&)su++;
x>>=;
}return su;
} int main(){
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
if(n<m)swap(n,m);//m是尽量小的那个
tot=;
memset(dp,,sizeof(dp));
memset(mark,,sizeof(mark));
for(LL i=;i<(<<m);i++){
if(!(i&(i<<))){//当前行是合法的
dp[][num(i)][tot]=;
mark[tot++]=i;//记录合法状态
}
}
for(int i=;i<=n;i++){
for(int j=;j<=k;j++){
for(LL x=;x<tot;x++){
for(LL y=;y<tot;y++){
if((mark[x]&mark[y])==&&j>=num(mark[x])){
dp[i][j][x]+=dp[i-][j-num(mark[x])][y];
}
}
}
}
}
ans=;
for(LL i=;i<tot;i++)
ans+=dp[n][k][i];
printf("%lld\n",ans);
}
}
【总结】
状态压缩dp要观察转移 ,定义要准确,灵活运用二进制
1.x=(1<<(i-1))|x;这个运算可以让x二进制下的第i位变成1
2.if(1<<(i<<1)&x==1)可以判断x二进制下的第i位是否为1,else就是不为1的情况
3.x=x&(x-1)这个是去掉x二进制下最右边的那个1,对奇偶都成立,可以自行举例证明
[HOJ2662]Pieces Assignment<状态压缩dp>的更多相关文章
- hoj2662 Pieces Assignment
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- HITOJ 2662 Pieces Assignment(状压DP)
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- HOJ-2662Pieces Assignment(状态压缩,动态规划)
Pieces Assignment Source : zhouguyue Time limit : 1 sec Memory limit : 64 M Submitted : 415, Accepte ...
- HOJ题目分类
各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...
- Atitit GRASP(General Responsibility Assignment Software Patterns),中文名称为“通用职责分配软件模式”
Atitit GRASP(General Responsibility Assignment Software Patterns),中文名称为"通用职责分配软件模式" 1. GRA ...
- user initialization list vs constructor assignment
[本文连接] http://www.cnblogs.com/hellogiser/p/user_initialization_list.html [分析] 初始化列表和构造函数内的赋值语句有何区别? ...
- Swift 提示:Initialization of variable was never used consider replacing with assignment to _ or removing it
Swift 提示:Initialization of variable was never used consider replacing with assignment to _ or removi ...
- 代写assignment
集英服务社,强于形,慧于心 集英服务社,是一家致力于优质学业设计的服务机构,为大家提供优质原创的学业解决方案.多年来,为海内外学子提供了多份原创优质的学业设计解决方案. 集英服务社,代写essay/a ...
随机推荐
- node--fs
1.fs模块内置方法 1)stat 检测是文件还是目录 fs.stat(fileAddress,(err,stats)=>{ //err 出错信息 //stats.isFile() 该东西是文件 ...
- python大佬养成计划----HTML网页设计(序列)
序列化标签 1.有序标签--ol和li 有序列表标签是<ol>,是一个双标签.在每一个列表项目前要使用<li>标签.<ol>标签的形式是带有前后顺序之分的编号.如果 ...
- 一步步去阅读koa源码,整体架构分析
阅读好的框架的源码有很多好处,从大神的视角去理解整个框架的设计思想.大到架构设计,小到可取的命名风格,还有设计模式.实现某类功能使用到的数据结构和算法等等. 使用koa 其实某个框架阅读源码的时候,首 ...
- Scrapy 入门教程
Scrapy 是用 Python 实现的一个为了爬取网站数据.提取结构性数据而编写的应用框架. Scrapy 常应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 通常我们可以很简单的通过 ...
- html5 拖放购物车
1.本例中模仿了购物车添加的功能 主要运用了ondragstart / ondragover/ ondrag 功能 功能比较简单 遗留问题:火狐下图片拖进会被打开 <!doctype html& ...
- $props, $attrs,$listeners的具体使用例子
我在这使用属性重新render饿了么ui的tree: <el-tree ref="tree" icon-class="fa fa-caret-right" ...
- SSM框架学习笔记
管理部门: --Spring + SpringMVC+MyBatis 1.index.jsp--->SpringMVC(Servlet) 接受客户端的请求,读取页面的值,回传到页面 2.Myba ...
- Redis(十二):redis请求转发的实现
请求转发一般的原因为: 1. 该请求自身无法处理,需要转发给对应的服务器处理: 2. 为实现负载均衡,使用路由服务,选择目标实例进行转发: 在集群模式下,请求可以打到任何一台redis服务器上.然而并 ...
- Natas29 Writeup(Perl命令注入、00截断、绕过过滤)
Natas29: 本关打开后,可以看到一个下拉列表,选择不同的内容,会得到不同的大量文本的页面. 观察url部分:http://natas29.natas.labs.overthewire.org/i ...
- Jmeter中使用MD5方法
在现在这家公司做测试的项目有用到鉴权,token的生成方式有使用到md5,具体的请求url和入参就不方便透露,讲一讲使用方法吧! 自带的Jmeter插件中是没有这个md5的所以,我们可以 (1)打开选 ...