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 ...
随机推荐
- CPU指令集不同导致的core分析
最近程序需要支持CGSL系统运行,测试中发现相同操作系统的两台机器,编译机运行正常,测试机coredump.core信息汇总如下,可以看出是由于测试机不支持编译后的指令导致的问题: Program t ...
- android自定义SlideMenu
完美解决ListView中子项焦点不可被Touch的BUG. 1.在Ecl ...
- URAL 1934 spfa算法
D - Black Spot Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...
- 使用ADO.NET 实体数据模型连接MySql
原文:使用ADO.NET 实体数据模型连接MySql 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/a123_z/article/details/8 ...
- mssql 格式化字符串 /时间 年月日时分秒
比如:1 想格式化 000001,100 格式化为000100: 思路是这样的 1000000 +格式化的数字 取后6位: select right(cast(power(10,6) as var ...
- GIS专业分析方法(待更新)
遗传算法 核密度估计 http://blog.163.com/zhuandi_h/blog/static/1802702882012111092743556/ http://blog.csdn.net ...
- mac 安装 navicat premium11.2.1400 破解版
前言: 在 Mac 系统下 安装 navicat for mysql 时,遇到注册码的问题,适用了很多破解下载,都没有成功,现找到一篇特此记录下. Mac 下一款实用的数据库管理工具--Navicat ...
- 静态页面之间的转发与json与ajax做到动态数据
我们见过很多使用jsp ,php,asp的动态网页技术的网站了,我们知道如果一个网站内容更新频率极低,而内容量不是十分庞大时,这样的网站(一次开发完成后不会需要较多的维护成本)的完全可以使用全部使用静 ...
- MySQL5.7源码安装问题汇总
编译安装mysql5.7版本,想试用一下新的版本特性,发现跟之前的5.6版本编译有了一些变化,总结一下避免以后继续入坑.5.6安装方式 cmake版本 5.7编译cmake要求版本最低为2.8,当前为 ...
- HDU 4667 Building Fence(求凸包的周长)
A - Building Fence Time Limit:1000MS Memory Limit:65535KB 64bit IO Format:%I64d & %I64u ...