POJ 1185炮兵阵地 (状压DP)
今天艾教留了一大堆线段树,表示做不动了,就补补前面的题。QAQ
这个题,我第一次写还是像前面HDU 2167那样写,发现这次影响第 i 行的还用i-2行那样,那以前的方法就行不通了。
找出所有可行的状态,因为每一行最大只有10列,所以一行里最多有4个,那它可行的状态不多(网上大多数说法最多是60个)。用dp[x][i][j]来转移,x表示第x行,i表示第x行的状态,j表示第x-1行的状态。先初始化前两行。
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = ;
#define legal(a,b) (a&b)
int base[maxn];
int state[maxn];
int solders[maxn];
int dp[maxn][maxn][maxn];
char s[maxn][];
int num = ;
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=;i<n;i++)
{
scanf("%s",s[i]);
for(int j=;j<m;j++)
{
if(s[i][j]=='H') base[i]+=(<<j); //记录山地
}
}
int d = ;
for(int i=;i<(<<m);i++) //删除一行中相互攻击的点
{
if(legal(i,i<<)||legal(i,i<<)) continue;
int k = i;
while(k) //记录里面有多少个炮台
{
solders[num]+=(&k);
k=k>>;
}
state[num++] = i;
}
for(int i=;i<num;i++) //初始化第0行
{
if(legal(state[i],base[])) continue;
dp[][i][] = solders[i];
}
for(int i=;i<num;i++) //初始化第1行,此为第二行
{
if(legal(state[i],base[])) continue;
for(int j=;j<num;j++) //枚举第一行
{
if(legal(state[j],base[])) continue;
if(legal(state[i],state[j])) continue;
dp[][i][j] = max(dp[][i][j],dp[][j][]+solders[i]);
}
} for(int r=;r<n;r++) //开始从第二行枚举
{
for(int i=;i<num;i++) //枚举r行
{
if(legal(state[i],base[r])) continue;
for(int j=;j<num;j++) //枚举r-1行
{
if(legal(state[j],base[r-])) continue;
if(legal(state[j],state[i])) continue;
for(int k=;k<num;k++) //枚举第r-2行
{
if(legal(state[k],base[r-])) continue;
if(legal(state[k],state[i])) continue;
if(legal(state[k],state[j])) continue;
dp[r][i][j] = max(dp[r][i][j],dp[r-][j][k]+solders[i]);
}
}
}
}
int maxx = ;
for(int i=;i<num;i++)
{
for(int j=;j<num;j++)
maxx = max(maxx,dp[n-][i][j]);
}
printf("%d\n",maxx);
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: 21553 Accepted: 8363 Description ...
- [poj 1185] 炮兵阵地 状压dp 位运算
Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...
- POJ1185 炮兵阵地 —— 状压DP
题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions ...
- TZOJ 4912 炮兵阵地(状压dp)
描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P" ...
- 洛谷P2704 [NOI2001]炮兵阵地 [状压DP]
题目传送门 炮兵阵地 题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图 ...
- [POJ1185][NOI2001]炮兵阵地 状压DP
题目链接:http://poj.org/problem?id=1185 很裸的状压,考虑对于一行用二进制储存每一种的状态,但是状态太多了做不了. 观察到有很多状态都是不合法的,于是我们预处理出合法的状 ...
- luogu 2704 炮兵阵地 状压dp
状压的基础题吧 第一次看感觉难上天,后来嘛就.. 套路:先根据自身状态筛出可行状态,再根据地图等其他限制条件筛选适合的状态加入答案 f i,j,k 分别代表 行数,本行状态,上行状态,再累加答案即可 ...
- [NOI2001]炮兵阵地 状压DP
题面: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最多 ...
随机推荐
- hdu_1115_Lifting the Stone(求多边形重心)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1115 题意:给你N个点围成的一个多边形,让你求这个多边形的重心. 题解: 将多边形划分为若干个三角形. ...
- MySQL 索引 总结
1.索引的种类(六种) 普通索引,唯一索引,全文索引,单列索引,多列索引,空间索引 2.优缺点及注意事项 优点:有了索引,对于记录数量很多的表,可以提高查询速度. 缺点:索引是占用空间的,索引会影响u ...
- RGB888转RGB666
内存中的数据排列高位在左,低位在右 RGB888->RGB666 高 -------低 B[3] B[2] B[1] B[0] ...
- AVFoundation(一)---AVAudioPlayer
AVAudioPlayer相当于一个播放器,它支持多种音频格式,而且能够进行进度.音量.播放速度等控制. 下边通过代码来看一下,它的属性和常用方法(具体说明都写在了注释中): //AVAudioPla ...
- 百度,google的地理编码
1.百度的地理编码:(不支持中国以外的其它城市) http://api.map.baidu.com/geocoder/v2/?ak=E974997f80db18330f8f5c61d084a677&a ...
- 优化eclipse
1.取消自动validation windows–>perferences–>validation 除开Manual下面的复选框全部选中之外,其他全部不选 如需验证,在要验证的文件上,单击 ...
- pipe的实现
本文进行了详细的描述,http://blog.csdn.net/zhouhong1026/article/details/8151235
- JUST SORT
We define B is a Divisor of one number A if A is divisible by B. So, the divisors of 12 are 1, 2, 3, ...
- JS定时器的使用--延时提示框
<title>无标题文档</title> <style> div{float:left;margin:10px;} #div1{width:50px; height ...
- dos命令创建安卓签名
1.dos下进入到jdk安装目录的bin目录, 如:C:\Program Files\Java\jdk1.7.0_79\bin 2.输入命令格式如: keytool -genkey -alias aa ...