POJ - 1185 炮兵阵地 (插头dp)
明明是道状压dp的题我为啥非要用插头dp乱搞啊
逐行枚举,设dp[i][S]为枚举到第i个格子时,状态为S的情况。S为当前行上的“插头”状态,每两个二进制位表示一个格子,设当前格子为(x,y),则y之前的插头表示左插头,y之后的插头表示上插头,仅当当前格子上没有插头时才能够放置炮兵。转移的大致流程为:枚举当前状态->判断是否可放置炮兵->更新右插头状态->更新上插头状态。
跑的速度还可以,虽然略输于状压dp。如果合法状态数不是那么少的话,可能会比状压dp要快。
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int N=+,inf=0x3f3f3f3f;
char s[N][];
struct Hashmap {
static const int N=1e5+;
int hd[N],nxt[N],fa[N],p[N],q[N],tot;
Hashmap() {memset(hd,-,sizeof hd),tot=;}
void clear() {for(int i=; i<tot; ++i)hd[fa[i]]=-; tot=;}
int size() {return tot;}
int& operator[](int x) {
int u=x%N;
for(int i=hd[u]; ~i; i=nxt[i]) {if(p[i]==x)return q[i];}
p[tot]=x,q[tot]=,fa[tot]=u,nxt[tot]=hd[u],hd[u]=tot++;
return q[tot-];
}
} dp[];
int n,m;
int get(int S,int y) {return y>=?S>>(*y)&:;}
int Set(int S,int y,int f) {return y>=?(S&~(<<(*y)))|(f<<(*y)):;}
int Max(int S,int y,int f) {return get(S,y)<f?Set(S,y,f):S;}
int sub(int S,int y) {return get(S,y)?Set(S,y,get(S,y)-):S;}
int put(int S,int y) {
for(int i=y+; i<=y+; ++i)S=Max(S,i,);
S=Max(S,y,);
return S;
}
void upd(int& x,int y) {if(x<y)x=y;}
int main() {
scanf("%d%d",&n,&m);
for(int i=; i<n; ++i)scanf("%s",s[i]);
dp[][]=;
for(int t=; t<n*m; ++t) {
dp[t&^].clear();
int x=t/m,y=t%m;
for(int i=; i<dp[t&].size(); ++i) {
int S=dp[t&].p[i],now=dp[t&].q[i];
upd(dp[t&^][sub(S,y)],now);
if(s[x][y]=='P'&&!get(S,y))upd(dp[t&^][put(S,y)],now+);
}
}
int ans=;
for(int i=; i<dp[(n*m)&].size(); ++i)upd(ans,dp[(n*m)&].q[i]);
printf("%d\n",ans);
return ;
}
POJ - 1185 炮兵阵地 (插头dp)的更多相关文章
- POJ 1185 炮兵阵地 状压dp
题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...
- POJ 1185 炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26426 Accepted: 10185 Descriptio ...
- POJ 1185炮兵阵地 (状压DP)
题目链接 POJ 1185 今天艾教留了一大堆线段树,表示做不动了,就补补前面的题.QAQ 这个题,我第一次写还是像前面HDU 2167那样写,发现这次影响第 i 行的还用i-2行那样,那以前的方法就 ...
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...
- POJ 1185 炮兵阵地 经典的 状态压缩dp
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16619 Accepted: 6325 Description ...
- POJ 1185 炮兵阵地(经典的状态压缩DP)
题意:中文题. 思路,经典的状态压缩题目. 由于列长比较小,我们可以以行为阶段用状态压缩来做. 由于攻击只占两个格,这样从行的角度看,第i行的炮兵只与前i-1和前i-2行有关系.这样如果用j,k,l分 ...
- POJ 1185 炮兵阵地(动态规划+状态压缩)
炮兵阵地 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原( ...
- POJ 1185 - 炮兵阵地 & HDU 4539 - 郑厂长系列故事——排兵布阵 - [状压DP]
印象中这道题好像我曾经肝过,但是没肝出来,现在肝出来了也挺开心的 题目链接:http://poj.org/problem?id=1185 Time Limit: 2000MS Memory Limit ...
- [poj 1185] 炮兵阵地 状压dp 位运算
Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...
随机推荐
- Python全栈开发之7、面向对象编程进阶-类属性和方法、异常处理和反射
一.类的属性 1.@property属性 作用就是通过@property把一个方法变成一个静态属性 class Room: def __init__(self,name,length,width,he ...
- POJ2411 Mondriaan's Dream 【状压dp】
没错,这道题又是我从LZL里的博客里剽过来的,他的题真不错,真香. 题目链接:http://poj.org/problem?id=2411 题目大意:给一个n * m的矩形, 要求用 1 * 2的小方 ...
- [转帖]InfluxDB 1.2.0安装及新旧版本的注意事项
InfluxDB 1.2.0安装及新旧版本的注意事项 http://haibing.org/245?zwlqby=npztq3 挺好的文章 很好的解决了 上一个文档里面 关于 web admin 的问 ...
- 【转帖】Office的光荣历史(2)
Office的光荣历史(2) https://www.sohu.com/a/201411215_657550 2017-10-31 10:57 7.MS Office 2000 (Office 9.0 ...
- PHP中各种强大的函数
获取时间 data(https://www.cnblogs.com/mrluotong/p/5895375.html):strtotime() <?php echo "今天:&qu ...
- 【LOJ】#3036. 「JOISC 2019 Day3」指定城市
LOJ#3036. 「JOISC 2019 Day3」指定城市 一个点的可以dp出来 两个点也可以dp出来 后面的就是在两个点的情况下选一条最长的链加进去,用线段树维护即可 #include < ...
- Spring的Bean的生命周期(大众版)
距离上一次写Spring源码解析,已经过去了快要好几个月了,主要原因还是Spring的源码解析类文章太难写了,不像我先前写的什么CAS源码,AQS源码,LinkedBlockingQueue等等, ...
- Jmeter之参数化(4种设置方法)
以多用户登录为例~~~ 参数化: 1.用户参数 2.CSV数据文件 3.函数助手CSVRead 4.用户自定义的变量 1.用户参数 脚本目录结构如下: 因为设置了2组账号密码,所以线程数设置为2(添加 ...
- Codeforces 1239C. Queue in the Train
传送门 事实上就是模拟 搞一个优先队列维护一下事件结构体:时间,人的编号,入队还是出队 再维护两个 $set$ ,队列内的人 $inQueue$ ,想要进入队列内的人 $want$ 然后模拟模拟模拟! ...
- spring-test跟junit结合单元测试获取ApplicationContext实例的方法
步骤 1.继承AbstractJUnit4SpringContextTests 2.引入ApplicationContext 示例代码:(可以根据name或者类型获取bean) import or ...