POJ - 1185 炮兵阵地 (状态压缩)
题目大意:中文题目就不多说大意了
解题思路:
1.每行最多仅仅有十个位置,且不是山地就是平原,那么就能够用1表示山地,0表示平原,将每一行的状态进行压缩了
2.接着找出每行能放炮兵的状态。先不考虑其它行放炮兵和该行的山地对其造成的影响,枚举出全部的状态。并记录每一个状态下放的炮兵数量
在上述情况下放炮兵。仅仅须要考虑同行的炮兵是否会相互攻击就能够了,那仅仅须要推断他的左边第一个位置是否有炮兵和左边第二个位置是否有炮兵就可以
3.接着进行dp,由于影响因素有两个。一个是上一行的状态,还有一个是上两行的状态,所以设dp[row][i][j]为第row行,放置状态为i,第row-1行,放置状态为j的情况下所能放的最多炮兵数量
可得到转移方程,在前两行不影响该行放置的
dp[row][i][j] = max(dp[row][i][j], dp[row-1][j][k] + i状态下能放置的炮兵数)
參考了这位大神的代码,写得很得具体这里写链接内容
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 110
#define maxm 20
#define maxs 70
int R, C, cnt;
char str[15];
int row[maxn], num[maxn], statu[maxn];
int dp[maxn][maxs][maxs];
void input() {
memset(row, 0, sizeof(row));
for(int i = 0; i < R; i++) {
scanf("%s", str);
for(int j = 0; j < C; j++)
if(str[j] == 'H')
row[i] += (1 << j);
}
}
void init_statu() {
memset(num, 0, sizeof(num));
cnt = 0;
for(int i = 0; i < (1 << C); i++) {
if((i & (i << 1)) || (i & (i << 2)))
continue;
int t = i;
while(t) {
num[cnt] += (t & 1);
t >>= 1;
}
statu[cnt++] = i;
}
}
void init_DP() {
memset(dp, 0, sizeof(dp));
for(int i = 0; i < cnt; i++) {
if(statu[i] & row[0])
continue;
dp[0][i][0] = num[i];
}
for(int i = 0; i < cnt; i++) {
if(statu[i] & row[1])
continue;
for(int j = 0; j < cnt; j++) {
if(statu[j] & row[0])
continue;
if(statu[i] & statu[j])
continue;
dp[1][i][j] = max(dp[1][i][j], dp[0][j][0] + num[i]);
}
}
}
int solve() {
for(int r = 2; r < R; r++) {
for(int i = 0; i < cnt; i++) {
if(statu[i] & row[r])
continue;
for(int j = 0; j < cnt; j++) {
if(statu[j] & row[r - 1])
continue;
if(statu[i] & statu[j])
continue;
for(int k = 0; k < cnt; k++) {
if(statu[k] & statu[j])
continue;
if(statu[k] & statu[i])
continue;
if(statu[k] & row[r - 2])
continue;
dp[r][i][j] = max(dp[r][i][j], dp[r - 1][j][k] + num[i]);
}
}
}
}
int ans = 0;
for(int i = 0; i < cnt; i++)
for(int j = 0; j < cnt; j++)
ans = max(ans, dp[R-1][i][j]);
return ans;
}
int main() {
while(scanf("%d%d", &R, &C) != EOF) {
input();
init_statu();
init_DP();
printf("%d\n", solve());
}
return 0;
}
POJ - 1185 炮兵阵地 (状态压缩)的更多相关文章
- poj 1185 炮兵阵地 状态压缩dp
思路:定义一个三维数组dp[x][i][j]其中x为now和pre两种状态,now表示当前两行最优解,pre表示出了本行外,前两行的最优解.那么状态转移方程为 dp[now][j][k]=max(dp ...
- POJ 3254 炮兵阵地(状态压缩DP)
题意:由方格组成的矩阵,每个方格可以放大炮用P表示,不可以放大炮用H表示,求放最多的大炮,大炮与大炮间不会互相攻击.大炮的攻击范围为两个方格. 分析:这次当前行的状态不仅和上一行有关,还和上上行有关, ...
- POJ 1185 炮兵阵地 状压dp
题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...
- POJ 1185 炮兵阵地(动态规划+状态压缩)
炮兵阵地 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原( ...
- POJ 1185 炮兵阵地 经典的 状态压缩dp
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16619 Accepted: 6325 Description ...
- POJ 1185 炮兵阵地(经典的状态压缩DP)
题意:中文题. 思路,经典的状态压缩题目. 由于列长比较小,我们可以以行为阶段用状态压缩来做. 由于攻击只占两个格,这样从行的角度看,第i行的炮兵只与前i-1和前i-2行有关系.这样如果用j,k,l分 ...
- POJ 1185 炮兵阵地 (状态压缩DP)
题目链接 Description 司令部的将军们打算在NM的网格地图上部署他们的炮兵部队.一个NM的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用& ...
- poj 1185 炮兵阵地 [经典状态压缩DP]
题意:略. 思路:由于每个大炮射程为2,所以如果对每一行状态压缩的话,能对它造成影响的就是上面的两行. 这里用dp[row][state1][state2]表示第row行状态为state2,第row- ...
- POJ 1185 炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 26426 Accepted: 10185 Descriptio ...
随机推荐
- BZOJ 1756: Vijos1083 小白逛公园
题目 1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 856 Solved: 264[Submit][Sta ...
- 解题报告 HDU1087 Super Jumping! Jumping! Jumping!
Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 ...
- icon-font图标介绍
前言 像素完美(Pixel Perfection).分辨率无关(Resolution Independent)和多平台体验一致性是设计师们的追求. 可访问性(Accessability).加载性能和重 ...
- 【转载】Java重构示例【1】
序言 本文通过Java示例代码片段展示了常用重构原则和技巧,供初级开发人员参考.精致的代码能够清楚传达作者的意图,精致的代码是最好的注释,精致的代码非常容易维护和扩展.程序员阅读精致的代码如同大众欣赏 ...
- H-JATG:NAND_FLASH的参数设置
JATG:NAND_FLASH 不同的cpu同一款flash: 相同的cpu不同的flash: 相同的cpu不同厂家的的flash:
- BZOJ 3626: [LNOI2014]LCA( 树链剖分 + 离线 )
说多了都是泪啊...调了这么久.. 离线可以搞 , 树链剖分就OK了... -------------------------------------------------------------- ...
- Android的WiFi开启与关闭
注意:要首先注册开启和关闭WiFi的权限, <?xml version="1.0" encoding="utf-8"?> <manifest ...
- form验证及图片上传
form验证及图片上传 这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能.开始之前需要源码同学可以先在git上fork:https://github.com/ ...
- MyEclipse8.5 中安装Spket插件
MyEclipse8.5 中安装Spket插件 安装: 1. Myeclipse8.5安装和以前低版本有些不同(没有software updates). 点击help->Myeclipse Co ...
- Android 四种启动模式 已看晕
http://blog.csdn.net/zdw890412/article/details/7386314 //有点乱 http://www.cnblogs.com/fanchangfa/arch ...