描述:

  有一个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>的更多相关文章

  1. hoj2662 Pieces Assignment

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  2. HITOJ 2662 Pieces Assignment(状压DP)

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  3. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  4. HOJ-2662Pieces Assignment(状态压缩,动态规划)

    Pieces Assignment Source : zhouguyue Time limit : 1 sec Memory limit : 64 M Submitted : 415, Accepte ...

  5. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  6. Atitit GRASP(General Responsibility Assignment Software Patterns),中文名称为“通用职责分配软件模式”

    Atitit GRASP(General Responsibility Assignment Software Patterns),中文名称为"通用职责分配软件模式" 1. GRA ...

  7. user initialization list vs constructor assignment

    [本文连接] http://www.cnblogs.com/hellogiser/p/user_initialization_list.html [分析] 初始化列表和构造函数内的赋值语句有何区别? ...

  8. 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 ...

  9. 代写assignment

    集英服务社,强于形,慧于心 集英服务社,是一家致力于优质学业设计的服务机构,为大家提供优质原创的学业解决方案.多年来,为海内外学子提供了多份原创优质的学业设计解决方案. 集英服务社,代写essay/a ...

随机推荐

  1. 如何理解js中的this和实际应用中需要避开哪些坑

    this是什么 this就是函数内部的关键字 看下面例子理解js中的this // 例子1 function fnOne () { console.log(this) } 'use strict' f ...

  2. 前端开发: webStorm手机真机调试

    目录 1. 做好准备工作 2. 开始设置 3. 配置路径 4. 匹配路径设置 5. 设置完成,即可体验 文章首发微信公众号飙码人生 2018-05-21 18:21:15 1. 做好准备工作 安装we ...

  3. Java基础--数组的定义

    1.数组的定义 数组:一组能够储存相同数据类型值的变量的集合. 2.数组的赋值方式 (1)使用默认的初始值来初始化数组中的每一个元素 语法:数组元素类型[]数组名 = new数组元素类型[数组中元素的 ...

  4. ubuntu16.04安装库、插件报错:

    安装一些插件.库,遇到报错 Could not fetch URL https://pypi.org/simple/pytest-pycodestyle/: There was a problem c ...

  5. 一套代码同时支持.NET Framework和.NET Core

    转自:https://www.cnblogs.com/tianqing/p/11614303.html 在.NET Core的迁移过程中,我们将原有的.NET Framework代码迁移到.NET C ...

  6. java之线程中断——interrupt

    如下图所示,interrupt()方法并没有成功的中断我们的线程. 为了便于理解,其实可以这样来类比(注意,只是类比,实际情况并不完全是这样):Thread类中有一个boolean的标志域用来表示线程 ...

  7. [python]回答百度知道上的问题2000-2999之间的回文日

    因为百度知道的编辑器没有提供代码功能,将回复写入. 题目如下: 求2000到2999的所有回文日,例如20200202 用Python怎么做 回文年好求,回文日的话,年月日这咋存啊 思路一:遍历每一天 ...

  8. OFD电子证照模版制作工具 --(采用wpf开发)

    前言  ofd应用的范围非常广,电子证照是其中非常重要的一个应用.同一类电子证照具有相同的板式.元数据:所以电子证照非常适合用模版来制作.模版就是板式样式固定,每个具体的证照只是文字或图片内容不同.比 ...

  9. chrome DevTools 里面 css样式里面 勾上 :hover 会将鼠标移上的效果一直保持,技巧:要在鼠标上的 div上 勾 :hover

    chrome DevTools 里面 css样式里面 勾上 :hover 会将鼠标移上的效果一直保持,技巧:要在鼠标上的 div上 勾 :hover

  10. ExifPro Mod 3.0 64位绿色中文版

    EXIFPro 是一个优秀的图像查看, 处理及管理工具, 使用 VC++ 开发, 小巧快速, 支持查看丰富的 EXIF 信息, 非常适用于查看您的 RAW 数字照片和其他常规图像.EXIFPro V1 ...