poj1185-炮兵阵地(状态压缩dp)
| Time Limit: 2000MS | Memory Limit: 65536K | |
| Total Submissions: 25647 | Accepted: 9892 |
Description

如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。
Input
接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。N <= 100;M <= 10。
Output
Sample Input
5 4
PHPP
PPHH
PPPP
PHPP
PHHP
Sample Output
6
#include <map>
#include <cstdio>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
const int maxn=;
int n,m,cnt,ans;
char ch;
int a[maxn+];
int vald[maxn+][<<+];
int valdcount[maxn+];
int dp[maxn+][maxn+][maxn+];
//map<int,int> ma[maxn+10];
bool judge(int x){
return (!(x&(x<<))&&!(x&(x<<)));
}
int BitCount(unsigned int n)
{
unsigned int c = ;
for (c =; n; ++c)
{
n &= (n -) ;
}
return c ;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
scanf(" %c",&ch);
if(ch=='H'){
a[i]|=(<<(j-));
}
}
}
for(int i=;i<=n;i++){
cnt=;
for(int j=;j<=((<<m)-);j++){
if((!(j&a[i]))&&judge(j)){
vald[i][cnt]=j;
//ma[i][j]=cnt;
cnt++;
}
}
valdcount[i]=cnt-;
}
for(int i=;i<=valdcount[];i++){
int x=vald[][i];
for(int j=;j<=(<<(m)-);j++) dp[][i][j]=BitCount(x);
}
for(int i=;i<=valdcount[];i++){
int x=vald[][i];
int q=BitCount(x);
for(int j=;j<=valdcount[];j++) {
int y=vald[][j];
if(!(x&y)) dp[][i][j]=max(dp[][i][j],q+BitCount(y));
}
}
for(int i=;i<=n;i++){
for(int j=;j<=valdcount[i];j++){
int x=vald[i][j];
int q=BitCount(x);
for(int k=;k<=valdcount[i-];k++){
int y=vald[i-][k];
for(int h=;h<=valdcount[i-];h++){
int z=vald[i-][h];
if(!(x&y)&&!(y&z)&&!(x&z)){
dp[i][j][k]=max(dp[i][j][k],dp[i-][k][h]+q);
}
}
}
}
}
for(int i=;i<=valdcount[n];i++){
int x=vald[n][i];
for(int j=;j<=valdcount[n-];j++) {
ans=max(ans,dp[n][i][j]);
}
}
printf("%d\n",ans);
return ;
}
poj1185-炮兵阵地(状态压缩dp)的更多相关文章
- POJ1185 - 炮兵阵地(状态压缩DP)
题目大意 中文的..直接搬过来... 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...
- POJ1185炮兵阵地(状态压缩 + dp)
题目链接 题意:给出一张n * m的地图,其中 有的地方能放大炮,有的地方不能,大炮与上下左右两个单位范围内会相互攻击,问最多能放几个大炮 能放大炮为1不能放大炮为0,把每一行看做一个状态,要除去同一 ...
- POJ1185 炮兵阵地 状态压缩
因为不知道不同的博客怎么转,就把别人的复制过来了,这个题解写的非常好,原地址为: http://hi.baidu.com/wangxustf/item/9138f80ce2292b8903ce1bc7 ...
- luogu2704 炮兵阵地 状态压缩DP
题目大意:一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),在每一格平原地形上最多可以布置一支炮兵部队,能攻击到的区域:沿横向左右各两格,沿纵向上 ...
- poj 1185 炮兵阵地 状态压缩dp
思路:定义一个三维数组dp[x][i][j]其中x为now和pre两种状态,now表示当前两行最优解,pre表示出了本行外,前两行的最优解.那么状态转移方程为 dp[now][j][k]=max(dp ...
- POJ 3254 炮兵阵地(状态压缩DP)
题意:由方格组成的矩阵,每个方格可以放大炮用P表示,不可以放大炮用H表示,求放最多的大炮,大炮与大炮间不会互相攻击.大炮的攻击范围为两个方格. 分析:这次当前行的状态不仅和上一行有关,还和上上行有关, ...
- POJ - 1185 炮兵阵地 (状态压缩)
题目大意:中文题目就不多说大意了 解题思路: 1.每行最多仅仅有十个位置,且不是山地就是平原,那么就能够用1表示山地,0表示平原,将每一行的状态进行压缩了 2.接着找出每行能放炮兵的状态.先不考虑其它 ...
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- [P2704][NOI2001]炮兵阵地 (状态压缩)
最近抄状压的代码…… 然后盯上了这个题目 调试了一个晚上,终于A了 但是是对着宝典打的,我依然不懂状态压缩 那么下一步先把装压放一放,学一下树形DP吧 #include<cstdio> # ...
- poj1185 炮兵阵地 状压dp
司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示) ...
随机推荐
- JavaScript里值比较的方法
JavaScript里值比较的方法 参考资料 一张图彻底搞懂JavaScript的==运算 toString()和valueof()方法的区别 Object.is 和 == 与 === 不同 == 运 ...
- hdu-5656 CA Loves GCD(dp+数论)
题目链接: CA Loves GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Ot ...
- T(n) = 25T(n/5)+n^2的时间复杂度
对于T(n) = a*T(n/b)+c*n^k;T(1) = c 这样的递归关系,有这样的结论: if (a > b^k) T(n) = O(n^(logb(a)));logb(a)b为底a ...
- poj2955——括号匹配
题目:http://poj.org/problem?id=2955 区间DP. 代码如下: #include<iostream> #include<cstdio> #inclu ...
- border-radius实现圆弧阴影效果
1 原理 利用border-radius实现一个圆弧边的矩形,并添加box-shadow,然后放在目标元素的下方 demo: html <div class="demo1"& ...
- spring boot 学习三:OAuth2 认证
1: 代码地址: https://github.com/liufeiSAP/uaa-zuul 2: 安装: postgres 下载 https://www.openscg.com/bigsq ...
- ubuntu 18.04 设置中文输入法
有下面几种常用选择: IBus拼音:sudo apt-get install ibus-pinyin IBUS五笔:sudo apt-get install ibus-table-wubi 谷歌拼音输 ...
- appium连真机问题
adb devices -l 后出现:List of devices attached 解决方法:用管理员身份运行以上命令 adb kill-server adb start-server adb d ...
- 虚拟机ubuntu和windows共享文件
设置虚拟机ubuntu和windows共享文件(方便复制文件到本机) (需要安装samba) 登陆ubuntu系统后,点击左边的文件夹.右击新建个文件夹. 设置为共享 ubuntu会提示你 ...
- Java类加载原理解析(转)
1 基本信息 每个开发人员对java.lang.ClassNotFoundExcetpion这个异常肯定都不陌生,这背后就涉及到了java技术体系中的类加载.Java的类加载机制是技术体系中比较核心的 ...