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 ...
随机推荐
- 每天一个Linux命令(5):rm命令
rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其下属的所有文件及其子目录均删除掉.对于链接文件,只是删除整个链接文件,而原有文件保持不变. 语法 rm (选项)(参数) 选项 - ...
- Java中Set的contains()方法——hashCode与equals方法的约定及重写原则
转自:http://blog.csdn.net/renfufei/article/details/14163329 翻译人员: 铁锚 翻译时间: 2013年11月5日 原文链接: Java hashC ...
- cannot bind to 127.0.0.1:5037 报错
使用appium连接真机时,提示这个错误,找了很久,发现是端口被占用 打开cmd,netstat -nao查看当前的TCP连接,找到使用127.0.0.1:5037的代码,然后到任务管理器查看详细进程 ...
- about 2018
2018想要完成的10件事情 1 活出更纯粹的自己. 未完成2 自考本科一定要过. ...
- 【LeetCode】Swap Nodes in Pairs(两两交换链表中的节点)
这是LeetCode里的第24题. 题目要求: 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 示例: 给定1->2->3->4, 你应该返回2->1->4- ...
- Day3 UI:7种常用控件、4种基本布局
Android常用控件 TextView <TextView android:id="@+id/text_view" android:layout_width="m ...
- Opencv3.0.0安装包
这个资源是Opencv3.0.0安装包,包括Windows软件包,Android软件包,IOS软件包,还有opencv的源代码:需要的下载吧. 点击下载
- CentOS下Apache虚拟主机配置
通过phpinfo可以看到Apache安装的目录 修改配置文件,首先将配置文件备份 编辑httpd.conf,并找到虚拟路径配置的部分 vi httpd.conf 在vi下先按esc在键入 :/vho ...
- shell之netstat命令
语 法:netstat [-acCeFghilMnNoprstuvVwx] [-A<网络类型>][--ip] 补充说明:利用netstat指令可让你得知整个Linux系统的网络情况. ...
- SQL SERVER 2008 bug
我把一个数据的数据导入的到另外一个数据库 作为 测试库使用. 发现里面设置为唯一标识ID 自动增长的表 全部默认是否. 最后只能手动一个个 表全部改过来. 弄了好久才发现这个问题.浪费了我几个小时的 ...