luogu 2704 炮兵阵地 状压dp
状压的基础题吧
第一次看感觉难上天,后来嘛就。。
套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案
f i,j,k 分别代表 行数,本行状态,上行状态,再累加答案即可
#include<bits/stdc++.h>
#define rep(i,x,y) for(register int i=x;i<=y;i++)
using namespace std;
inline int read(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-;ch=getchar();}
while(isdigit(ch)){x=(x<<)+(x<<)+(ch^);ch=getchar();}
return x*f;}
inline int calc(int x){int ans=;for(;x;x-=x&(-x))ans++;return ans;}
//state 状态的具体集合
//num 状态的答案贡献(1数量)
int cnt,n,m;
int f[][][],num[],state[],g[];
void dp(){
int ans=;
memset(f,,sizeof f);
for(int i=;i<n;i++)//本行
for(int j=;j<cnt;j++){//本行状态
if(g[i]&state[j]) continue;
if(i==) f[i][j][]=num[j];
else if(i==){
for(int k=;k<cnt;k++){
if(g[i-]&state[k]) continue;
if(state[j]&state[k]) continue;
f[i][j][k]=max(f[i][j][k],f[i-][k][]+num[j]);
}
}else{
for(int k=;k<cnt;k++){
if(g[i-]&state[k]) continue;
if(state[j]&state[k]) continue;
for(int p=;p<cnt;p++){
if(g[i-]&state[p]) continue;
if(state[k]&state[p]||state[j]&state[p]) continue;
//三行都要兼容
f[i][j][k]=max(f[i][j][k],f[i-][k][p]+num[j]);
}
}
}
}
for(int j=;j<cnt;j++)
for(int k=;k<cnt;k++)
ans=max(ans,f[n-][j][k]);
printf("%d\n",ans);
}
int main(){
char s[];
int i,j;
n=read();m=read();
for(i=;i<n;i++){
scanf("%s",s);
for(j=;j<m;j++)
if(s[j]=='H') g[i]+=(<<(m--j));
}
int tmp;cnt=;
for(int i=;i<(<<m);i++){
tmp=i;
if(((tmp<<)&i)|((tmp<<)&i)) continue;
state[cnt]=i;
num[cnt]=calc(i);++cnt;}
//利用函数计算当前状态中1的数量
//cnt代表当前限制条件下合法状态
dp();return ;
}
//先根据自身条件确定状态
//再根据给定地图判断
luogu 2704 炮兵阵地 状压dp的更多相关文章
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
- TZOJ 4912 炮兵阵地(状压dp)
描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...
- POJ 1185 炮兵阵地 状压dp
题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...
- [NOI2001]炮兵阵地 状压DP
题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...
- [POJ1185][NOI2001]炮兵阵地 状压DP
题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...
- 炮兵阵地 /// 状压DP oj26314
题目大意: 炮兵阵地 设置炮兵的位置 其上两位 下两位 左两位 右两位 不能同时设置炮兵 这题是 corn fields玉米地 的升级版 可以先看下这题的注释 更详细些 第一种方法是网上大多数题解的解 ...
- P2704 [NOI2001]炮兵阵地 (状压DP)
题目: P2704 [NOI2001]炮兵阵地 解析: 和互不侵犯一样 就是多了一格 用\(f[i][j][k]\)表示第i行,上一行状态为\(j\),上上行状态为\(k\)的最多的可以放的炮兵 发现 ...
随机推荐
- 牛客OI周赛7-提高组 B小睿睿的询问(ST打表)
链接:https://ac.nowcoder.com/acm/contest/371/B来源:牛客网 小睿睿的n个妹纸排成一排,每个妹纸有一个颜值val[i].有m个询问,对于每一个询问,小睿睿想知道 ...
- js 判断字符串中是否包含某个字符串
String对象的方法 方法一: indexOf() (推荐) var str = "123"; console.log(str.indexOf("3") ...
- cf 990G - GCD Counting
题意 #include<bits/stdc++.h> #define t 200000 #define MAXN 200100 using namespace std; int n; in ...
- JavaScript 正整数正则表达式
function testNumber(){ var yourinputValue=$("#yourinputId").val(); var reg = /^[1-9]\d*$/ ...
- java远程下载图片
从别的网站复制文章的时候,要把图片下载到我们网站,再把图片地址换成我们网站的地址 <img id="mbkenHUwhWeOj9U8K6c8LlAXaes3oXit-M4SnmRvB4 ...
- DB2常用命令整理
1.基本命令 查看命令选项list command options信息帮助SQL statement例子:statement =30081SQL30081启动当前的DB2数据库管理实例db2start ...
- qml性能优化(来源于群友分享);
Qt quick性能优化 使用时间驱动 避免定时轮询: 使用信号槽形式: 使用多线程 C++; QML WorkerScript元件: 使用Qt Quick Compiler 只需要再PRO文件中添加 ...
- 【 强大的Mac/iOS开发工具】AppCode for Mac 2017.3
[简介] 最新的 AppCode 2017.3 版本,完全支持最新的Swift 4.0语言,这是一款JetBrain出品的强大的OS X 和 iOS开发工具,AppCode可以用于开发 Mac OS ...
- 信用评分卡 (part 2of 7)
python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...
- Openldap命令详解
Openldap 客户端常用管理命令 1.ldapadd -x: 简答认证方式 -W: 不需要在命令上写密码 ldapapp -x -D "cn=Manager,dc=suixingpay, ...