poj1185(状态压缩DP)
poj1185
题意
给出字母矩阵,只能在字母为 P 的位置放置大炮,
如图所示,每个大炮的射程固定,现在要求尽可能多的放大炮,且使得每个大炮都不在其它大炮的射程内。问最多能放多少。
分析
poj3254
很类似的一道题,但是注意到这道题,放置一个大炮后,不仅影响到与之相邻的下一行,同时对下下一行产生影响,也就是说某一个地点能否存在大炮,取决于它上面两行的状态,那么状态的转移就和上面两行有关,两层循环枚举上面两层的可行状态,判断加上这一层的状态后是否合法(即对于连续的 3 行,每一列最多只能存在一个 1),如果合法,加上这个状态下在这一行最多能放大炮的数量,不断更新最大值。
可以预处理一行的状态,求得同时在这一行最多放几个大炮。
code
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
typedef long long ll;
const int MAXN = (1 << 10) + 10;
int dp[105][MAXN][MAXN];
int num[1 << 10];
string str;
bool check(int j, int s) { // 判断 j 是否是一个可行状态
return (j | s) == s && (j & (j >> 1)) == 0
&& (j & (j >> 2)) == 0;
}
void F(int n) {
vector<int> v;
if(!n) cout << 0;
while(n) {
v.push_back(n & 1);
n /= 2;
}
for(int i = v.size() - 1; i >= 0; i--) {
cout << v[i];
}
}
int main() {
int n, m;
cin >> n >> m;
for(int i = 0; i < (1 << m); i++) {
int k = 0;
for(int j = 0; j < 11; j++) {
if(!k) {
if((i >> j) & 1) {
k = 3;
num[i]++;
} else k = 1;
}
k--;
}
}
vector<int> vec1, vec2, vec3; // vec2存上一层的可行状态,vec1存上上一层的可行状态
int ans = 0;
for(int i = 0; i < n; i++) {
cin >> str;
int s = 0;
for(int j = 0; j < m; j++) {
if(str[j] == 'P') {
s |= (1 << j);
}
}
if(i > 1) {
vec3.clear();
for(int j = 0; j < (1 << m); j++) {
if(check(j, s)) {
for(int v = 0; v < vec1.size(); v++) {
for(int e = 0; e < vec2.size(); e++) {
if((j & vec1[v]) == 0 && (j & vec2[e]) == 0 && (vec1[v] & vec2[e]) == 0) { // 保证连续 3 行每一列最多只有一个 1
dp[i][j][vec2[e]] = max(dp[i][j][vec2[e]], dp[i - 1][vec2[e]][vec1[v]] + num[j]);
ans = max(ans, dp[i][j][vec2[e]]);
}
}
}
vec3.push_back(j);
}
}
vec1 = vec2;
vec2 = vec3;
} else if(!i) {
for(int j = 0; j < (1 << m); j++) {
if(check(j, s)) {
dp[i][j][0] = num[j];
ans = max(ans, num[j]);
vec1.push_back(j);
}
}
} else {
for(int j = 0; j < (1 << m); j++) {
if(check(j, s)) {
for(int k = 0; k < vec1.size(); k++) {
if((j & vec1[k]) == 0) {
dp[i][j][vec1[k]] = dp[i - 1][vec1[k]][0] + num[j];
ans = max(ans, dp[i][j][vec1[k]]);
}
}
vec2.push_back(j);
}
}
}
}
cout << ans << endl;
return 0;
}
poj1185(状态压缩DP)的更多相关文章
- POJ1185状态压缩DP
难得的中文题. POJ1185http://poj.org/problem?id=1185 方法就是用DP[i][r][p]表示第i行状态为r,第i-1行状态是p时的最多个数.而这里p受到r的限制,而 ...
- POJ1185 - 炮兵阵地(状态压缩DP)
题目大意 中文的..直接搬过来... 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
- 状态压缩DP总结
POJ1185 炮兵部队问题: 在平原上才能放置炮兵,每个炮兵的上下左右2格之内都不能出现别的炮兵 可以考虑在当前行放置炮兵它的右侧和下侧绝对不会出现炮兵即可,左侧和上侧就能省去考虑 明显的状态压缩d ...
- 状态压缩DP(大佬写的很好,转来看)
奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- [知识点]状态压缩DP
// 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...
- HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- 状态压缩dp问题
问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...
随机推荐
- 【Kth Smallest Element in a BST 】cpp
题目: Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. ...
- Dapper 学习笔记
一.基础 1.Dapper代码就一个SqlMapper.cs文件, 前人测试Dapper速度较快 的Orm,读取速度接近IDataReader,超过DataTable. 2.a.下载地址 https: ...
- Percona-Tookit工具包之pt-summary
Preface As a dba,We are obliged to master several basic tools(such as vmstat,top,netstat,ios ...
- svn 数据库 账号密码
47.106.107.201 云商传媒李孔文 2018/8/22 19:26:35 root 云商传媒李孔文 2018/8/22 19:26:39 sn123456 云商传媒李孔文 2018/8/22 ...
- php天龙八部
<?php /* 一.操作步骤: 连接MySQL数据库 判断是否连接成功 选择数据库 设置字符集 准备SQL语句 向MySQL服务发送SQL语句 解析处理结果集 释放结果集,关闭数据库连接 */ ...
- [译]在python中如何有效的比较两个无序的列表是否包含完全同样的元素(不是set)?
原文来源: https://stackoverflow.com/questions/7828867/how-to-efficiently-compare-two-unordered-lists-not ...
- java值转递?引用传递?
值传递是传递的是原值的副本,引用传递传递的是原值. 在Java中,如果是基本数据类型,传递的是该参数字面量值的拷贝.如果是引用数据类型,传递的是该参数所引用对象在堆中地址的拷贝. swap(int a ...
- bzoj1264 [AHOI2006]基因匹配Match 树状数组+lcs
1264: [AHOI2006]基因匹配Match Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1255 Solved: 835[Submit][ ...
- javaScript构造函数、原型、面向对象编程
js最重要也是最核心的东西就是对象了,入行这么长时间,一直对面向对象一知半解.网上有很多介绍对象对象的内容,这里也做了很多借鉴, 尤其是阮一峰老师的文章.我这里写的大多例子都是阮一峰老师文章的例子,但 ...
- Mysql性能优化【转】
mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. Mysql数据库的优化技术 对mysql优化是一个综合性的技术,主要包括 表的设计合理化(符合3NF ...