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\)的最多的可以放的炮兵 发现 ...
随机推荐
- Java 帝国之建造者模式
Java 帝国之建造者模式 原创: 王钦誉 码农翻身 今天 本文来自王钦誉的投稿,老刘做了较大修改. 原文地址: https://xiaoqinyu0000.github.io/2018/06/11/ ...
- QML-关于Qt.rgba()颜色无法正常显示问题
GitHub:八至 作者:狐狸家的鱼 本文链接:关于Qt.rgba()颜色的正确写法 当在正常给color属性写颜色的时候,用十六进制能正常显示,但是用Qt.rgba()时,颜色无法正常显示出来. 按 ...
- 【洛谷P1637】三元上升子序列
题目大意:给定一个长度为 N 的序列,求有多少个三元组满足 \(i<j<k,a_i<a_j<a_k\). 题解:这是一类二维偏序问题,与逆序对问题类似. 对于序列中每个点来说, ...
- Go语言(IDEA下+Eclipse下)Hello World
第一步,去下载Go环境 然后安装即可. IDEA 先安装GO插件: ..点击Browse... ..搜索GO ..点击安装,安装完之后重启 ..重启完之后,New~(IDEA已经自动识别出系统中安装的 ...
- java的线程
public class Test1 extends Thread{ public void run(){ // } } public class Test2 immplement Runnable{ ...
- 改xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...
- 原生JS实现jquery的ready
function ready(fn){ if(document.addEventListener){ //标准浏览器 document.addEventListener('DOMContentLoad ...
- (string 数组) leetcode 804. Unique Morse Code Words
International Morse Code defines a standard encoding where each letter is mapped to a series of dots ...
- 【优秀的素材收藏管理工具】Inboard for Mac 1.1
[简介] Inboard 1.1 版本,Inboard 是一款Mac上强大的设计素材管理器,Inboard功能简洁实用,是设计师必备的一款软件,集成Dribbble,支持从 Safari.Chrome ...
- [ZJOI2007]棋盘制作 悬线法dp 求限制下的最大子矩阵
https://www.luogu.org/problemnew/show/P1169 第一次听说到这种dp的名称叫做悬线法,听起来好厉害 题意是求一个矩阵内的最大01交错子矩阵,开始想的是dp[20 ...