状压的基础题吧
第一次看感觉难上天,后来嘛就。。
套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案
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\)的最多的可以放的炮兵 发现 ...
随机推荐
-
PLSQL查询字段为科学计数法,修正显示
打开PLSQL工具--- toad中->view->option->data->display large number in scientific notationpl/sq ...
-
【转】Controllers and Routers in ASP.NET MVC 3
Controllers and Routers in ASP.NET MVC 3 ambilykk, 3 May 2011 CPOL 4.79 (23 votes) Rate: vote 1vote ...
-
Play libs
The play.libs package contains several useful libraries that will help you to achieve common program ...
-
GenericServlet,HttpServletRequest和HttpServletResponse
最基本的是通过实现Servlet接口来编写Servlet类,这需要实现Servlet接口中定义的5个方法. 为了简化Servlet的编写,在javax.servlet包中提供了一个抽象类Generic ...
-
一、	使用存储过程实现数据分页(Sql Server 2008 R2)
1.废话不多说了,直接上代码.调用这个存储过程只需要传递 表名,排序字段,搜索字段,以及页码,页码数量,搜索值(可空) create PROCEDURE NewPage --通用的分页存储过程,百万数 ...
-
CodeIgniter框架介绍
入口 index.php :一些路径常量定义: => CodeIgniter.php : 1. 初始化一些 system/core内的类,例如Config, Utf8, URI 和Router等 ...
-
动态绑定、阻止继承,final类和方法
1.编译器查看对象的声明类型和方法名.当调用 x.f(param); 且隐式参数x生命为C类对象.这时候可能有多个名字都叫f,但是参数类型不一样的方法.编译器会一一列举C类中名为f的方法和其超类中访问 ...
-
jre配置了1.6,但是eclipse仍然提示需要1.6以上的java
问题: eclipse创建web项目时,提示错误:Dynamic Web Module 3.0 requires Java 1.6 or newer. 原因: 这是因为当前的编译器java版本太低,请 ...
-
【枚举+小技巧】【TOJ4115】【Find the number】
题目大意 找到一个最小的奇数 约数个数为n 结果mod10^9+7 根据 约数个数=(p1+1)*(p2+1)............ 将n 枚举分解成连乘式.(枚举个数,dfs) 比较大小 log ...
-
java第二天
while循环 基本格式: int sum=0: int i =0:初始化循环变量值 while(i<10循环条件){ 循环变量变化的过程 i++: 循环体 sum+=i; System.out ...