本题过于经典......

对于这种网格状压DP,套路一波刷表法DFS转移就没了。

三进制状压,0表示当前,上一个都没有。1表示当前无,上一个有。2表示当前有。

转移的条件就是上一行为0,当前不是山地,且左边两个都不是2。

注意有个坑点,全部转移会超时。因为本题有很多废状态(山地),初始化-1然后判断是否转移即可。

 #include <cstdio>
#include <algorithm>
#include <cstring> const int N = , M = ; int n, m, f[N][], pre[M], now[M], ans, G[N][M];
char str[M]; inline int zip(int *a) {
int t = ;
for(int i = ; i < m; i++) {
t = t * + a[i];
}
return t;
} inline void unzip(int x, int *a) {
for(int i = m - ; i >= ; i--) {
a[i] = x % ;
x /= ;
}
return;
} void DFS(int x, int y, int lastans) {
if(y >= m) {
int s = zip(now);
f[x][s] = std::max(f[x][s], lastans);
ans = std::max(ans, lastans);
return;
}
DFS(x, y + , lastans);
if(!G[x][y] && pre[y] == && (y < || now[y - ] < ) && (y < || now[y - ] < )) {
now[y] = ;
DFS(x, y + , lastans + );
now[y] = ;
}
return;
} int main() {
memset(f, -, sizeof(f));
scanf("%d%d", &n, &m);
for(int i = ; i <= n; i++) {
scanf("%s", str);
for(int j = ; j < m; j++) {
G[i][j] = (str[j] == 'H');
}
} int lm = ;
for(int i = ; i <= m; i++) {
lm *= ;
}
f[][] = ;
for(int i = ; i < n; i++) {
for(int s = ; s < lm; s++) {
if(f[i][s] == -) {
continue;
}
unzip(s, pre);
for(int j = ; j < m; j++) {
now[j] = std::max(, pre[j] - );
}
DFS(i + , , f[i][s]);
}
} printf("%d", ans);
return ;
}

AC代码

我数组一开始开了2^m个......应该是3^m。

洛谷P2704 炮兵阵地的更多相关文章

  1. 【题解】洛谷P2704 [NOI2001] 炮兵阵地(状压DP)

    洛谷P2704:https://www.luogu.org/problemnew/show/P2704 思路 这道题一开始以为是什么基于状压的高端算法 没想到只是一道加了一行状态判断的状压DP而已 与 ...

  2. [洛谷P2704] [NOI2001]炮兵阵地

    洛谷题目链接:[NOI2001]炮兵阵地 题目描述 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示), ...

  3. 【洛谷P2704【NOI2001】】炮兵阵地

    题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最 ...

  4. 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]

    题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...

  5. C++ 洛谷 P2704 [NOI2001]炮兵阵地

    P2704 [NOI2001]炮兵阵地 没学状压DP的看一下 此题意思很简单,如下图,就是十字架上的不能有两个点放炮兵. 在做此题前,先做一下玉米田 玉米田题解 分析: 而m即一行的个数小于等于10, ...

  6. 关于三目运算符与if语句的效率与洛谷P2704题解

    题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最 ...

  7. 【洛谷P2704】炮兵阵地

    题目大意:定义一个炮兵会影响该点所在坐标上下左右两个格子的范围,求一个 N*M 的网格里最多可以放多少个炮兵. 题解:发现这个问题有需要记录两个状态,即:上一层的状态和上两层的状态,若直接进行记录,空 ...

  8. 洛谷 P2704 [NOI2001]炮兵阵地

    题意简述 给定一张地图,有山地H,平原P,平原可放置炮兵, 炮兵可以攻击沿横向左右各两格,沿纵向上下各两格的区域 求最多放几个炮兵,使他们两两攻击不到 题解思路 枚举第i层,第i - 1层,第i - ...

  9. 洛谷P2704 [NOI2001]炮兵阵地题解

    题目描述 司令部的将军们打算在\(N * M\)的网格地图上部署他们的炮兵部队.一个\(N * M\)的地图由N行M列组成,地图的每一格可能是山地(用\("H"\) 表示),也可能 ...

随机推荐

  1. Spring在web开发中的应用

    (1)在 web 项目中要使用 spring 需要导入一个 jar 包: spring-web-4.2.4.jar包 (2)在 web.xml 文件中配置 Listener <listener& ...

  2. (三)类数组对象 NamedNodeMap简单介绍

    Ele.attrbutes将返回一个NamedNodeMap对象,即NamedNodeMap存储的是元素的“特性Attribute”集合.而集合中的每一个元素,都是Attr类型的对象. html: & ...

  3. python爬虫scrapy之如何同时执行多个scrapy爬行任务

    背景: 刚开始学习scrapy爬虫框架的时候,就在想如果我在服务器上执行一个爬虫任务的话,还说的过去.但是我不能每个爬虫任务就新建一个项目吧.例如我建立了一个知乎的爬行任务,但是我在这个爬行任务中,写 ...

  4. B站弹幕姬(🐔)分析与开发(下篇)

    接上篇 下面开始分析弹幕信息: 当我们在完成和服务器的握手之后,b站的弹幕服务器就会开始不停的开始给我们推送相关房间的弹幕消息了.老规矩前面16个字节是这个包的相关信息,我们先来看下这条消息的前面16 ...

  5. Netcat实用操作

    写久了web倦了,第n次开始尝试网络开发,于是熟悉一下常用工具. 尝试了一下netcat来测试服务器,或者充当客户端都异常好用.于是记录一下常用的一下命令 1. 充当服务器,或者客户端进行访问 通过n ...

  6. C# 中那些常用的工具类(Utility Class)(三)

    今天来接着写这个系列的文章,这一篇主要是用来介绍关于C#中的XML序列化的问题,这个相信大家一定会经常使用它,特别是在WPF中,有时候我们需要将我们后台的数据保存在数据库中,从而在软件下一次启动的时候 ...

  7. 对于tomcat通过catalina.sh停止服务后,tomcat进程没有退出问题解决办法

    例:tomcat路径及名称为/data/apache-tomcat-7.0.67/ vim /data/apache-tomcat-7.0.67/bin/catalina.sh 找到org.apach ...

  8. MyBatis的XML中使用内部类的方式

    内部类需要使用$符号连接,而不是点.,如 com.pingan.job.openapi.model.SMSESBResult$ReceiveResult$ResultInfo 从CSDN论坛查到的. ...

  9. qtp 自动货测试桌面程序-笔记(使用参数 parameters)

    dtGlobalSheet:运行整个test时候使用的参数(心得:可以将公共使用的测试数据放于全局表格中,所有action脚本都可以使用同一个数据,如供应商.客户.商品) dtActionSheet: ...

  10. Python——WeRobot(微信公众号开发)

    模板消息接口 ''' 使用规则 1.所有服务号都可以在功能->添加功能插件处看到申请模板消息功能的入口,但只有认证后的服务号才可以申请模板消息的使用权限并获得该权限: 2.需要选择公众账号服务所 ...