POJ 1185 炮兵阵地(经典的状态压缩DP)
题意:中文题。
思路,经典的状态压缩题目。
由于列长比较小,我们可以以行为阶段用状态压缩来做。
由于攻击只占两个格,这样从行的角度看,第i行的炮兵只与前i-1和前i-2行有关系。这样如果用j,k,l分别表示第i,i-1,i-2行的炮兵摆放状态,而num[i][j]表示第i个摆放状态为j时的炮兵个数。dp[i][k][j]表示以i为最后一行,倒数第一行摆放为j,倒数第二行摆放为k时的最优解。
这样得到状态转移方程dp[i][k][j]=max{dp[i-1][l][k]+num[i][j]},前提是j和k、l都不互相攻击。
其中炮兵的摆放状态要预处理出来,如果m至大为10,这样枚举的话最多是2^10。由于最后得到合法状态不多,使用的时候可以直接用保存的下标而不是用二进制表示状态。这样可以大大提高时空复杂度。
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<vector>
using namespace std;
vector<];
vector<];
][];
int m,n;
bool check(int sta,int d)
{
<<d);
}
bool check1(int c,int sta)//检查是否在山上放炮
{
; i<m; ++i)
if(grid[c][i]=='H'&&check(sta,i))
return false;
return true;
}
bool attack(int d,int sta)//某状态下判断同行之间是否相互攻击
{
>=&&check(sta,d-)) return true;
>=&&check(sta,d-)) return true;
<m&&check(sta,d+)) return true;
<m&&check(sta,d+)) return true;
return false;
}
int check2(int sta)//判断是否互相攻击和统计炮个数
{
;
; i<m; ++i)
if(check(sta,i))
{
;
else cnt++;
}
return cnt;
}
void init(int c)
{
; i<(<<m); ++i)
if(check1(c,i))//没有放在山坡上的情况
{
int cnt=check2(i);//判断是否互相攻击和炮个数
)
{
sta[c].push_back(i);//保存摆放位置状态
num[c].push_back(cnt);//保存对应状态下的个数
}
}
}
][][];
bool attack2(int sta1,int sta2)//判断不同行之间的状态下炮是否互相攻击
{
; i<m; ++i)
if(check(sta1,i)&&check(sta2,i)) return true;
return false;
}
int main()
{
scanf("%d%d",&n,&m);
; i<=n; ++i)
{
scanf("%s",grid[i]);
init(i);
}
)
{
;
;i<sta[].size();++i)
ans=max(ans,num[][i]);
printf("%d\n",ans);
;
}
; i<sta[].size(); ++i)
; j<sta[].size(); ++j)
][i],sta[][j]))
dp[][i][j]=num[][i]+num[][j];
; i<=n; ++i)
{
; k<sta[i].size(); ++k)
; j<sta[i-].size(); ++j)
{
][j];
if(!attack2(stak,staj))
{
;
; l<sta[i-].size(); ++l)
{
][l];
if(!attack2(stak,stal)&&!attack2(staj,stal))
maxn=max(maxn,dp[i-][l][j]);
}
dp[i][j][k]=maxn+num[i][k];
}
}
}
;
; i<sta[n].size(); ++i)
; j<sta[n-].size(); ++j)
ans=max(ans,dp[n][j][i]);
printf("%d\n",ans);
;
}
POJ 1185 炮兵阵地(经典的状态压缩DP)的更多相关文章
- POJ 1185 炮兵阵地 经典的 状态压缩dp
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16619 Accepted: 6325 Description ...
- POJ 1185 炮兵阵地(动态规划+状态压缩)
炮兵阵地 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原( ...
- poj 1185 炮兵阵地 [经典状态压缩DP]
题意:略. 思路:由于每个大炮射程为2,所以如果对每一行状态压缩的话,能对它造成影响的就是上面的两行. 这里用dp[row][state1][state2]表示第row行状态为state2,第row- ...
- poj -1185 炮兵阵地 (经典状压dp)
http://poj.org/problem?id=1185 参考博客:http://poj.org/problem?id=1185 大神博客已经讲的很清楚了,注意存状态的时候是从1开始的,所以初始化 ...
- 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: 26426 Accepted: 10185 Descriptio ...
- poj - 1185 炮兵阵地 状压DP 解题报告
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 21553 Accepted: 8363 Description ...
- POJ 1185炮兵阵地 (状压DP)
题目链接 POJ 1185 今天艾教留了一大堆线段树,表示做不动了,就补补前面的题.QAQ 这个题,我第一次写还是像前面HDU 2167那样写,发现这次影响第 i 行的还用i-2行那样,那以前的方法就 ...
- POJ - 1185 炮兵阵地 (插头dp)
题目链接 明明是道状压dp的题我为啥非要用插头dp乱搞啊 逐行枚举,设dp[i][S]为枚举到第i个格子时,状态为S的情况.S为当前行上的“插头”状态,每两个二进制位表示一个格子,设当前格子为(x,y ...
随机推荐
- 联想VIBE UI 固件ROM刷机包集合
固件下载_联想乐问吧http://ask.lenovomobile.com/?c-157.html 联想VIBE UI 固件ROM刷机包集合 悬赏分:0 解决时间:2014/09/12 15: ...
- 项目解析- JspLibrary - part3
CRUD read: String sql = "select b.*,c.name as bookcaseName,p.pubname as publishing,t.typename f ...
- 【poj2728】Desert King
[poj2728]Desert King 题意 最优比率生成树. http://blog.csdn.net/ophunter_lcm/article/details/10113817 分析 Dinke ...
- DI 之 3.2 循环依赖 (伍)
3.2.1 什么是循环依赖 循环依赖就是循环引用,就是两个或多个Bean相互之间的持有对方,比如CircleA引用CircleB,CircleB引用CircleC,CircleC引用CircleA, ...
- 使用EPPLUS操作EXcel
使用EPPLUS操作EXcel 时间 2014-11-06 19:28:01 姜糖水 原文 http://www.cnphp6.com/archives/58648 主题 Excel 1 下载Ep ...
- Ubuntu安装nodeJS
安装环境 ubuntu12.04 64bit nodejs-v0.8.14.tar.gz Node.js是一个基于google v8+javascript的服务端编程框架.但是Node.js又不是js ...
- maven工程打包成runnable的jar包,拷贝资源和依赖jar包
eclipse下新建maven工程,生成runnable的jar包.之前一直是手动拷贝依赖的jar包和资源文件,烦得要死.上网可劲查了一下.解决方案如下. 在pom的配置文件中做如下配置: <b ...
- X-UniTMX:导入大型Tiled地图文件(*.tmx)到Unity3d中比较好的插件
因工作原因,需要导入格子数为1200x1200的Tiled地图文件(*.tmx)到Unity3d中显示出来.尝试过一些其它插件,后面发现X-UniTMX是比较好用的. X-UniTMXhttp://f ...
- HTML5自学笔记[ 6 ]data自定义数据
在标签中添加data-name属性并赋值,在js脚本中用ele.dataset.name就可以获取该属性的值.如: <div id="box" data-age=" ...
- C++中静态数据成员
类的静态成员不能由类的构造函数来初始化.因为即使不存在类的任何对象时,类的静态成员依然存在并且可以被使用.类的静态成员也不能访问任何类的非静态成员. 类名和类对象都可以直接调用静态数据成员.因为静态数 ...