Pieces Assignment

My Tags   (Edit)
  Source : zhouguyue
  Time limit : 1 sec   Memory limit : 64 M

Submitted : 539, Accepted : 190

Background

有一个n*m的棋盘(n、m≤80,n*m≤80)要在棋盘上放k(k≤20)个棋子,使得任意两个棋子不相邻(每个棋子最多和周围4个棋子相邻)。求合法的方案总数。

Input

本题有多组测试数据,每组输入包含三个正整数n,m和k。

Output

对于每组输入,输出只有一个正整数,即合法的方案数。

Sample Input

2 2 3
4 4 1

Sample Output

0
16

题目链接:HITOJ 2662

由于实验室内大神讲了高大上的状压DP,于是就就去看了一下,感觉还是比较好理解的,就是感觉状态转移对于我这种还没入门的就比较难想到了……

dp[i][j][k]表示当前已遍历过i行,总共用了j个棋子,且最后一行摆放状态为k的方案数,然后就是如何进行状态的转移呢?首先DP总得要初始化的吧,先考虑只有一行的情况(实际上初始化的时候可以把所有合法的行状态都保存下来方便之后遍历),一行里的方案数就只需要初始化dp[1][j][k1]

把一行看成m个位置,每一个位置都是0或1,1表示放了棋子,0表示没放,比如一行3个棋子,可以是这样101、110、010、000、111(二进制)等等,如何判断当前摆放情况是否合法呢,这里要用到位运算&,即当前的状态转换成10进制进行&运算,sta&(sta<<1),可以发现若存在两个或以上1相邻的情况,按位与的结果必定不为0即不合法,然后在不知道如何摆放的情况下遍历所有可能的方案,上面的例子三个位置一共有2*2*2=8种情况,分别是011、101、110、100、010、001、111、000,但其实把n位全部填满最多只会达到2n-1因此可以for (i=0; i<=(1<<3)-1; ++i),然后把每一个行状态判断一下并保存在合法状态的集合里,然后对每一行都进行判断,

转移方程就是dp[i][j][k1]+=dp[i-1][j-这一行二进制状态所含1的个数count][k2](j>=count&&k1与k2不冲突)

代码:

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <sstream>
#include <cstring>
#include <bitset>
#include <string>
#include <deque>
#include <stack>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define LC(x) (x<<1)
#define RC(x) ((x<<1)+1)
#define MID(x,y) ((x+y)>>1)
typedef pair<int,int> pii;
typedef long long LL;
const double PI=acos(-1.0);
const int M=1<<9;
LL dp[82][22][M];//第i行、用了j个棋子、状态为第k个
int status[M];inline bool check(const int &a,const int &b)
{return (a&b)==0;//这里要加括号,==的优先级比&高
}int main(void)
{int n,m,k,i,j,pre,cur;while (~scanf("%d%d%d",&n,&m,&k)){CLR(dp,0);if(m>n)//m保持较小swap(n,m);int legalcnt=0;int totalsta=(1<<m)-1;for (i=0; i<=totalsta; ++i){if(check(i,i>>1)){dp[1][bitset<10>(i).count()][legalcnt]=1LL;status[legalcnt++]=i;}}for (i=2; i<=n; ++i){for (j=0; j<=k; ++j){for (cur=0; cur<legalcnt; ++cur){for(pre=0; pre<legalcnt; ++pre){int curuse=bitset<10>(status[cur]).count();if(check(status[pre],status[cur])&&j>=curuse){dp[i][j][cur]+=dp[i-1][j-curuse][pre];}}}}}LL r=0;for (i=0; i<legalcnt; ++i)r+=dp[n][k][i];printf("%lld\n",r);}return 0;
}

转载于:https://www.cnblogs.com/Blackops/p/5987268.html

HITOJ 2662 Pieces Assignment(状压DP)相关推荐

  1. hoj 2662 Pieces Assignment

    Background 有一个n*m的棋盘(n.m≤80,n*m≤80)要在棋盘上放k(k≤20)个棋子,使得任意两个棋子不相邻(每个棋子最多和周围4个棋子相邻).求合法的方案总数. Input 本题有 ...

  2. 动态规划 —— 状压 DP

    [概述] 通常将以一个集合内的元素信息作为状态且状态总数为指数级别的动态规划称为状态压缩动态规划. 其是一类以集合信息为状态的特殊的动态规划问题,主要有传统集合动态规划与基于连通性状态压缩的动态规划两 ...

  3. 状压dp个人刷题记录

    目录 一.普通型 蒙德里安的梦想 题意: 思路: code: #2153. 「SCOI2005」互不侵犯 题意: 思路: code: P1879 [USACO06NOV]Corn Fields G 题 ...

  4. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    \(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP) \(solution:\) 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地 ...

  5. codeforces 8C. Looking for Order 状压dp

    题目链接 给n个物品的坐标, 和一个包裹的位置, 包裹不能移动. 每次最多可以拿两个物品, 然后将它们放到包里, 求将所有物品放到包里所需走的最小路程. 直接状压dp就好了. #include < ...

  6. UVA10296 Jogging Trails(中国邮递员问题)(欧拉回路、一般图最大权匹配 / 状压DP)

    整理的算法模板合集: ACM模板 目录 思路 UVA10296 Jogging Trails 题目翻译: 给你n个点,m条无向边,每条边有一定的距离数值,构造成一个连通图.问从任意一点出发,遍历所有的 ...

  7. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  8. 【每日DP】day2、P1879 [USACO06NOV]Corn Fields G玉米地(状压DP模板题)难度⭐⭐⭐★

    昨天的每日DP我还在写01背包,今天就到状压DP了,真刺激. P1879 [USACO06NOV]Corn Fields G 题目链接 输入 2 3 1 1 1 0 1 0 输出 9 一道简单的状压D ...

  9. hdu 4778 Gems Fight! 状压dp

    转自wdd :http://blog.csdn.net/u010535824/article/details/38540835 题目链接:hdu 4778 状压DP 用DP[i]表示从i状态选到结束得 ...

最新文章

  1. springboot知识
  2. python 简易 http server
  3. Linux系统入门学习:在Debian或Ubuntu上安装完整的内核源码
  4. 伟大的人为什么伟大呢?
  5. 系统开发基础:UML中图的相关知识笔记(上)
  6. 很口语blood-aholic
  7. Python any 函数 - Python零基础入门教程
  8. Springboot底层注解(容器功能)
  9. mkdir 与mkdir -p 区别
  10. 那些年,翻过山,趟过河,挖了山丘,黑了河沟,终于还是遇到了——跨服务器查询...
  11. jquery系列教程1-选择器全解
  12. 面试题--------5、==与equals的区别
  13. 使用DataTables合并行
  14. 教孩子编程python 语言 nostarch 下载_教孩子学编程 Python语言版
  15. Windows环境下sublime text 3搭建前端开发环境
  16. CPU连续飙升的背后是 “道德的沦丧” 还是 “人性的泯灭”
  17. 无人驾驶小车调试笔记(五)-- 命令行通信
  18. 微信小程序超级占内存_实测:微信小程序占多少内存?或许真没有你想象的那么“小”!...
  19. 淘宝下单时出现关单提醒
  20. 编程题——合法括号序列

热门文章

  1. 【Objective-C】05-第一个OC的类
  2. [iOS]swift版内购
  3. 让lubuntu13.10中的virtualbox使用u盘
  4. Archlinux in VirtualBox
  5. php curl nginx post 空_【青藤云安全研究】绕过php的disable_functions(上篇)
  6. c语言中判断输入是否为数字_C语言编程判断回文数
  7. 怎么把python和pycharm关联_Python3 安装pylint 及与PyCharm关联
  8. python中排序的函数_Python中sorted()排序函数
  9. RocketMQ(四)—— 单机与集群安装
  10. html提交按钮tab设置,html – 提交按钮没有集中,即使tabindex被正确设置