题意:由方格组成的矩阵,每个方格可以放大炮用P表示,不可以放大炮用H表示,求放最多的大炮,大炮与大炮间不会互相攻击。大炮的攻击范围为两个方格。

分析:这次当前行的状态不仅和上一行有关,还和上上行有关,所以用三维dp【i】【j】【k】来表示第i行的状态为j,i-1行状态为k时最多的大炮。

一开始看数据量为100 * 1024 * 1024 铁定要爆,但是由于大炮的攻击方式,单独看每一行最多只有几十种可行的状态,所以保存好这些状态就行了。

#include <cstdio>
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int n,m,sum;
int dp[105][1 << 7][1 << 7]; // dp【i】【j】【k】来表示第i行的状态为j,i-1行状态为k时最多的大炮
int buff[1 << 6]; // 存状态
int bar[105]; // 存障碍
int num[1 << 6]; // 存每种状态中1的个数,即为大炮的个数
char map[105][11];
void init() {
memset(bar,0,sizeof(bar));
memset(dp,0,sizeof(dp));
memset(buff,0,sizeof(buff));
memset(num,0,sizeof(num));
sum = 0;
}
void barrier() {
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
if(map[i][j] == 'H') {
int move = m - j - 1;
bar[i] += (1 << move);
}
}
}
} bool judge(int s) {
while(s) {
if(s & 1) {
if(((s >> 1) & 1) || ((s >> 2) & 1)) return false;
}
s = s >> 1;
}
return true;
} void getbuff() {
int total = 1 << m;
for(int i=0; i<total; i++) {
if(judge(i)) buff[sum++] = i;
}
} int cal(int s) {
int cnt = 0;
while(s) {
if(s & 1) cnt ++;
s = s >> 1;
}
return cnt;
} void getnum() {
for(int i=0; i<sum; i++) {
num[i] = cal(buff[i]);
}
}
int main() {
scanf("%d%d",&n,&m);
init();
for(int i=0; i<n; i++) scanf("%s",map[i]);
barrier();
getbuff();
getnum();
for(int i=0; i<n; i++) {
for(int j=0; j<sum; j++) {
if(bar[0] & buff[j]) continue;
for(int k=0; k<sum; k++) {
dp[0][j][k] = num[j];
}
}
}
for(int i=1; i<n; i++) {
for(int j=0; j<sum; j++) {
if(bar[i] & buff[j]) continue;
for(int k=0; k<sum; k++) {
if(bar[i-1] & buff[k]) continue;
if((buff[j] & buff[k])) continue;
for(int l=0; l<sum; l++) {
if(i != 1) {
if(bar[i-2] & buff[l]) continue;
if(buff[k] & buff[l] || buff[j] & buff[l]) continue;
}
dp[i][j][k] = max(dp[i][j][k],
dp[i-1][k][l] + num[j]);
}
}
}
}
int ans = 0;
for(int i=0; i<n; i++) {
for(int j=0; j<sum; j++) {
for(int k=0; k<sum; k++) {
ans = max(ans,dp[i][j][k]);
}
}
}
printf("%d\n",ans);
return 0;
}

POJ 3254 炮兵阵地(状态压缩DP)的更多相关文章

  1. poj 1185 炮兵阵地 状态压缩dp

    思路:定义一个三维数组dp[x][i][j]其中x为now和pre两种状态,now表示当前两行最优解,pre表示出了本行外,前两行的最优解.那么状态转移方程为 dp[now][j][k]=max(dp ...

  2. POJ1185 - 炮兵阵地(状态压缩DP)

    题目大意 中文的..直接搬过来... 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  3. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  4. POJ 3254 Corn Fields (状态压缩DP)

    题意:在由方格组成的矩形里面种草,相邻方格不能都种草,有障碍的地方不能种草,问有多少种种草方案(不种也算一种方案). 分析:方格边长范围只有12,用状态压缩dp好解决. 预处理:每一行的障碍用一个状态 ...

  5. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  6. POJ 3254 Corn Fields 状态压缩DP (C++/Java)

    id=3254">http://poj.org/problem? id=3254 题目大意: 一个农民有n行m列的地方,每一个格子用1代表能够种草地,而0不能够.放牛仅仅能在有草地的. ...

  7. POJ - 1185 炮兵阵地 (状态压缩)

    题目大意:中文题目就不多说大意了 解题思路: 1.每行最多仅仅有十个位置,且不是山地就是平原,那么就能够用1表示山地,0表示平原,将每一行的状态进行压缩了 2.接着找出每行能放炮兵的状态.先不考虑其它 ...

  8. poj - 3254 Corn Fields (状态压缩dp入门)

    http://poj.org/problem?id=3254 参考:http://blog.csdn.net/accry/article/details/6607703 农夫想在m*n的土地上种玉米, ...

  9. POJ 3254 Corn Fields状态压缩DP

    下面有别人的题解报告,并且不止这一个状态压缩题的哦···· http://blog.csdn.net/accry/article/details/6607703 下面是我的代码,代码很挫,绝对有很大的 ...

随机推荐

  1. 【Cocos2d-X开发学习笔记】第19期:动作管理类(CCActionManager)的使用

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 一.动作管理类 动作管理类CCActionMan ...

  2. 【C疯狂的教材】(九)C语言指针(一)

    1.什么是地址? 内存是由若干个1个字节的内存单元组成的存储器 计算机为了管理内存单元.给每一个字节都进行编号 编号的就是地址 2.什么是指针? 地址就是指针 地址: 地址指向的内存单元值:编号相应的 ...

  3. Win7x64安装Oracle11201x64 解决PLSQL Developer无法找到oci问题

    http://blog.sina.com.cn/s/blog_4c7628c40101cf56.html http://blog.csdn.net/shenkxiao/article/details/ ...

  4. Apache与Tomcat区别联系

    监控服务(师傅让我监控Tomcat,我知道Apache,所以以为他两是一个东东.结果半天就没有找到Tomcat的服务进程,还理直气壮的说:找不到Apache......希望这篇简单的,白话分析,能让还 ...

  5. 常见HTTP状态码的含义

    200 请求已成功,请求所希望的响应头或数据体将随此响应返回. 301 被请求的资源已永久移动到新位置. 302 请求的资源现在临时从不同的 URI 响应请求. 400 1.语义有误,当前请求无法被服 ...

  6. Javascript进阶篇——(DOM—认识DOM、ByName、ByTagName)—笔记整理

    认识DOM文档对象模型DOM(Document Object Model)定义访问和处理HTML文档的标准方法.DOM 将HTML文档呈现为带有元素.属性和文本的树结构(节点树). 将HTML代码分解 ...

  7. (转)关于font-size:100%

    重设浏览器默认字体大小 h1,h2,h3,h4,h5,h6 {font-size:100%;font-weight:normal;} 假如你设置body{font-size:12px;} 但h1是不会 ...

  8. 如何安装windows7系统

      在XP时代,光驱对于我们而言仅仅是装系统用,不过在Win7发布之后,可以用U盘直接安装,省时省力. 首先在互联网下载UltraISO光盘映像文件制作/编辑/格式转换工具,(当然还有其它如WinIS ...

  9. SVN的初步使用方法

    1.需要公司提供SVN账号密码 2.cd 输入本地存储路径 3.输入服务器地址 --uesr= (账号名) --password=(账号密码) 4.本地路径会自动创建文件 5.经理会初始化项目 5.1 ...

  10. C#之获取本地IP地址

    最近协助一个项目解决了一个获取IP地址的问题,手机客户端与WebService进行通讯,然后WebService通过TCP通讯把指令传递到另一台PC机上.在测试的过程中,总是会出现WebService ...