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”表示),如下图.在每一格平原地形上最多 ...
随机推荐
- philosophy
Even though the UNIX system introduces a number of innovative programs and techniques, no single pro ...
- LR的VG与Control之间的关系,并发的实质
LR的VG与Control之间的关系,经过无数次的实验,搞清楚了现实意义的并发.传说每秒有几百,几千,几万用户并发,基本属于设想状态. 在一秒内处理多少个请求,完全在于服务器处理能力的强弱.这里需要强 ...
- Row_Number实现分页
1:首先是 select ROW_NUMBER() over(order by id asc) as 'rowNumber', * from table1 生成带序号的集合 2:再查询该集合的 第 1 ...
- wpf之Popup弹出自定义输入"键盘"
在很多工厂的信息化MES系统中,车间的采集数据的机器是触摸屏电脑(工厂环境所限,用外接鼠标键盘反而不方便). 由于没有外接键盘,所以用户无法像坐在办公室一样,用鼠标键盘进行录入信息. 这时我们可以用w ...
- TCP数据包结构
源端口号( 16 位):它(连同源主机 IP 地址)标识源主机的一个应用进程.目的端口号( 16 位):它(连同目的主机 IP 地址)标识目的主机的一个应用进程.这两个值加上 IP 报头中的源主机 I ...
- OC与Swift桥接问题
入职新公司后,接手了一个Swift项目.项目质量已经吐槽过一次就略过了,感兴趣的可以看我之前的博客.当然我之前对Swift只是略有了解,略到只看过没写过的程度,主要语言还是OC.不过嘛其实语言都是相通 ...
- VMI
在虚拟机外部监控虚拟机内部运行状态的方法被称为虚拟机自省(Virtual Machine Introspection,VMI).VMI允许特权域查看非特权域的运行状态,并能获得被监控虚拟机运行状况相关 ...
- SqlServer 查询死锁,杀死死锁进程
-- 查询死锁 select request_session_id spid, OBJECT_NAME(resource_associated_entity_id) tableName from sy ...
- cmd下载文件
进入cmd 输入ftp 192.168.1.200 然后按照提示输入用户名和密码 cd 进入要下载的目录 dir 看操作权限 lcd查看本地要装下载文件的目录 prompt关闭交互模式 mget da ...
- lucene中Field.Index,Field.Store的一些设置
lucene在doc.add(new Field("content",curArt.getContent(),Field.Store.NO,Field.Index.TOKENIZE ...