2018.09.08 poj1185 炮兵阵地(状压dp)
传送门
状压dp经典题。
我们把每一行的状态压成01串。
预处理出每一行可能出现的状态,然后转移每个被压缩的状态的1的个数就行了。
注意当前行转移要考虑前两行的状态。
还要注意只有一行的情况。
代码:
#include<iostream>
#include<cctype>
#include<cstdio>
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int sta[105][70],tot[105],n,m,f[105][70][70],cal[105][70];
inline int calc(int x){
int ret=0;
while(x)x-=x&-x,++ret;
return ret;
}
int main(){
n=read(),m=read(),tot[0]=1;
for(int i=1;i<=n;++i){
char s[15];
int x=0;
scanf("%s",s);
for(int j=0;j<m;++j)if(s[j]=='H')x|=1<<j;
for(int j=0;j<(1<<m);++j){
if((j&(j<<1))||(j&(j<<2))||(j&x))continue;
sta[i][++tot[i]]=j,cal[i][tot[i]]=calc(j);
}
}
for(int i=1;i<=tot[1];++i)f[1][i][1]=cal[1][i];
for(int i=1;i<=tot[2];++i)
for(int j=1;j<=tot[1];++j){
if(sta[2][i]&sta[1][j])continue;
f[2][i][j]=max(f[2][i][j],f[1][j][1]+cal[2][i]);
}
for(int i=3;i<=n;++i){
for(int j=1;j<=tot[i];++j)
for(int k=1;k<=tot[i-1];++k){
if(sta[i][j]&sta[i-1][k])continue;
for(int l=1;l<=tot[i-2];++l){
if((sta[i][j]&sta[i-2][l])||(sta[i-1][k]&sta[i-2][l]))continue;
f[i][j][k]=max(f[i][j][k],f[i-1][k][l]+cal[i][j]);
}
}
}
int ans=0;
for(int i=1;i<=tot[n];++i)
for(int j=1;j<=tot[n-1];++j){
if(sta[n][i]&sta[n-1][j])continue;
ans=max(ans,f[n][i][j]);
}
cout<<ans;
return 0;
}
2018.09.08 poj1185 炮兵阵地(状压dp)的更多相关文章
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- poj1185 炮兵阵地 状压dp
司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示) ...
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
- TZOJ 4912 炮兵阵地(状压dp)
描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...
- [POJ1185][NOI2001]炮兵阵地 状压DP
题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...
- [NOI2001]炮兵阵地 状压DP
题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...
- luogu 2704 炮兵阵地 状压dp
状压的基础题吧 第一次看感觉难上天,后来嘛就.. 套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案 f i,j,k 分别代表 行数,本行状态,上行状态,再累加答案即可 ...
- POJ 1185 炮兵阵地 状压dp
题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...
随机推荐
- leetcode754
class Solution { public: int reachNumber(int target) { // 理解这题的意思 这题就好做了 // 分析 首先考虑一种比较极端的情况 即一直向正方向 ...
- leetcode167
public class Solution { public int[] TwoSum(int[] numbers, int target) { Dictionary<int, int> ...
- clip-path的任意元素的碎片拼接动效
看了张大神的这篇文章后自己写的,兼容性不好clip-path要加-webkit- css #test img{position: absolute;} .active .clip{ will-chan ...
- 多线程--Java
多线程: 1.进程和线程 进程是资源分配的最小单位,线程是CPU调度的最小单位. 每个进程的创建都需要系统为其开辟资源内存空间,并发执行的程序在执行过程中分配和管理资源的基本单位,速度和销毁也较慢.进 ...
- 移动cup
intel处理器M和U H结尾的有什么具体区别 笔记本CPU 酷睿i 系列U M H详解: U 低压版(低电压-性能消减)最低主频:1.7-1.9GHZ M 准电压(笔记本上的电压标准)最低主频:2. ...
- 显示AVI的第一桢
procedure TForm1.Button1Click(Sender: TObject);begin Application.ProcessMessages; MediaPlayer1.Ope ...
- js获取或判断任意数据类类型的通用方法(getDataType)和将NodeList转为数组(NodeListToArray)
function getDataType(any){ /* (1) Object.prototype.toString.call 方法判断类型: 优点:通用,返回"[object Strin ...
- 删除临时表空间ora-25152错误
删除临时表空间,或者收缩临时表空间经常会出现表空间占用等情况. 下面我们就对这种情况进行处理, 首先查找被锁的sid: SELECT a.INST_ID,b.TABLESPACE , b.segfil ...
- linux一些基本常识(三)
acl:对本身权限的扩展 打包:zip 111.zip a.txt b.txt..... zip -r /etc/sysconfig/* (样才能第归所有内容0) 解宝:uzip 1 ...
- centos7 opencc 安装
繁体字转换:http://xh.5156edu.com/jtof.php 转换的有问题http://tool.lu/zhconvert/ git网址:https://github.com/BYVoid ...