POJ 1321 棋盘问题(状态压缩DP)
不总结的话, 同一个地方会 WA 到死
思路:
状态压缩 DP.
1. s 表示压缩状态, 若第 i 列放了棋子, 那么该列置 1, 否则该列置 0. 假如 s = 3(0x011) 那么表示棋盘的第 2, 3 列已经放了棋子
2. dp[i][s] 表示前 i 行, 状态为 s 的摆放方案数
dp[i][s] = dp[i-1][s] 假如第 i 行不放棋子
dp[i][s] = dp[i-1][oldState] 假如第 i 行放棋子
3. 棋盘的最大长宽为 8, 所以 s 的状态最多有 1<<8 个, 用 int 足以
4. 此题能用状态压缩的根源在于每一列只能摆放一个棋子
总结:
1. dp 框架问题. 最外一层循环, 遍历的是行数, 这个比较明显, 而第二层循环遍历的是状态 s, 根据是 dp 的定义 dp[i][s], 至于 j, 只能放在第三层
2. 空间优化. dp[i][s] 可以优化到 dp[s], 代价是 第二层循环 s 必须从大到小遍历, 这样才能保证 push 更新 --- 考虑状态转移方程
dp[i][s] = dp[i-1][s] , dp[i-1][oldS], 等号右边的 s, oldS 编号都是第 i-1 层的, 假如对 s 正向遍历, 那么 s , oldS 对应的就是第 i 层的了
3. 错误点. i 的起始是 (1<<N)-1, 这地方第一次做这题错了, 写成 1<<8
4. 错误点. 移位的优先级较低, 需要加括号 (1<<N)-1
5. bitset 操作
for(int i = 0; i < 1<<n; i ++) {
bitset<10> getOne(i);
if( getOne.count() == c)
res += record[i];
}
6. record[0] = 1 比较精髓, 空间优化后的一个好处是初始化比较简单
7. 位操作, &, |
代码:
#include <bitset>
#include <iostream>
using namespace std;
const int MAXN = 10;
char grid[MAXN][MAXN];
int record[1<<8];
int N, K; int mainFunction() {
memset(record, 0, sizeof(record));
record[0] = 1; // very talent
for(int i = 0; i < N; i ++) {
for(int s = (1<<N)-1; s >= 0; s--) {
for(int j = 0; j < N; j++) {
if(grid[i][j]=='#' &&((1<<j)&s)==0) {
record[s|(1<<j)] += record[s];
}
}
}
}
int sum = 0;
for(int s = (1<<N)-1; s > 0; s --) {
bitset<10> temp(s);
if(temp.count() == K)
sum += record[s];
}
return sum;
}
int main() {
freopen("E:\\Copy\\ACM\\poj\\2_1321\\in.txt", "r", stdin);
while(cin >> N >> K && N != -1) {
for(int i = 0; i < N; i ++) {
for(int j = 0; j < N; j ++) {
cin >> grid[i][j];
}
} cout << mainFunction() << endl;
}
return 0;
}
POJ 1321 棋盘问题(状态压缩DP)的更多相关文章
- POJ 3691 (AC自动机+状态压缩DP)
题目链接: http://poj.org/problem?id=3691 题目大意:给定N个致病DNA片段以及一个最终DNA片段.问最终DNA片段最少修改多少个字符,使得不包含任一致病DNA. 解题 ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- POJ 3254 Corn Fields (状态压缩DP)
题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案). 分析:方格边长范围只有12,用状态压缩dp好解决. 预处理:每一行的障碍用一个状态 ...
- POJ 3254. Corn Fields 状态压缩DP (入门级)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 9806 Accepted: 5185 Descr ...
- POJ 3254 Corn Fields 状态压缩DP (C++/Java)
id=3254">http://poj.org/problem? id=3254 题目大意: 一个农民有n行m列的地方,每一个格子用1代表能够种草地,而0不能够.放牛仅仅能在有草地的. ...
- POJ 3254 Corn Fields状态压缩DP
下面有别人的题解报告,并且不止这一个状态压缩题的哦···· http://blog.csdn.net/accry/article/details/6607703 下面是我的代码,代码很挫,绝对有很大的 ...
- poj - 3254 Corn Fields (状态压缩dp入门)
http://poj.org/problem?id=3254 参考:http://blog.csdn.net/accry/article/details/6607703 农夫想在m*n的土地上种玉米, ...
- poj 1191 棋盘切割 (压缩dp+记忆化搜索)
一,题意: 中文题 二.分析: 主要利用压缩dp与记忆化搜索思想 三,代码: #include <iostream> #include <stdio.h> #include & ...
- poj 1185 炮兵阵地 状态压缩dp
思路:定义一个三维数组dp[x][i][j]其中x为now和pre两种状态,now表示当前两行最优解,pre表示出了本行外,前两行的最优解.那么状态转移方程为 dp[now][j][k]=max(dp ...
随机推荐
- spark-streaming问题集锦
报错: // :: ERROR Utils: Exception encountered py4j.Py4JException: Cannot obtain a new communication c ...
- CentOS7.3 搭建Openvpn
环境:CentOS Linux release 7.3.1611 (Core) 查看os版本命令:[root@openvpn ~]# cat /etc/redhat-release 命令记录如下: y ...
- RSA算法工具
RSA算法工具-生成密钥对(生成密钥对) RSA算法工具-解析密钥对(导入密钥对,解析密钥对) RSA测试工具-计算分量(输入P,Q,E,计算出N,DP,DQ,Qinv)
- 一款基于css3的简单的鼠标悬停按钮
今天给大家分享一款基于css3的简单的鼠标悬停按钮.这款悬停按钮鼠标经过前边框是间断的.当鼠标经过的时候边框间隔消失.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div ...
- 一款基于jquery滑动后固定于顶部的导航
之前已为大家介绍了好多css3实现的导航菜单.今天分享一款基于jquery滑动后固定于顶部的导航.这款导航的特点是初始位于顶部下面一百个像素,当鼠标滚动时到下方,导航一直处于顶部.效果图如下: 在线预 ...
- RocketMQ集群搭建
1.RocketMQ介绍 1.1. 简介 RocketMQ 是一款分布式.队列模型的消息中间件,具有以下特点: 能够保证严格的消息顺序 提供丰富的消息拉取模式 高效的订阅者水平扩展能力 实时的消息订阅 ...
- debian配置ftp
大家好,最近几天我在配置vsftpd,总结出如何更快的配置vsftpd1.我的系统是debian 5.02.安装 vsftpd, apt-get install vsftpd3.配置 vsftpdcd ...
- l2正则化
在机器学习中,无论是分类还是回归,都可能存在由于特征过多而导致的过拟合问题.当然解决的办法有 (1)减少特征,留取最重要的特征. (2)惩罚不重要的特征的权重. 但是通常情况下,我们不知道应该惩罚哪些 ...
- android 创建 xml文件
android创建xml文件的方法. 要操作android的外部存储,所以要在AndroidManifest.xml文件中添加权限. <uses-permission android:name= ...
- http的GET和POST
本文主要内容 1. GET和POST方法介绍 2. 源代码分析 3. 结果分析 4. 例子参考及引用: http://www.cnblogs.com/zhijianliutang/archiv ...