#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string> using namespace std; const int MAXN = 100 + 1; //阵地行数
const int MAXM = 10 + 1; //阵地列数
const int State_Num = 60 + 1; //阵地列状态的压缩总数,合法状态总数最多60 int dp[MAXN][State_Num][State_Num], cur[MAXN], state[State_Num], tot;
char field[MAXN][MAXM]; //储存阵地
int n, m; //阵地规模 /*
因为n <= 100, m <= 10,将阵地的列压缩。
dp[i][j][k]表示当第i行布置结束后,第i行的布置状态为j的情况下,
第i - 1行的状态为k,所能布置的最多的炮兵。 依据题意,我们能够删除一些状态。
删除的状态有:
1.山地不能布置炮兵
2.炮兵不能在垂直和水平的线上两格相邻。
cur[]数组用于储存输入的合法局面
state[]数组用于储存相邻的合法局面
*/ bool ok(int x)
{
return !((x & (x << 1)) || (x & (x << 2)));
} void init() //保留不两格相邻的
{
int limit = (1 << m);
tot = 0; for (int i = 0; i < limit; i++)
{
if (ok(i)) state[tot++] = i;
}
} bool yes(int x, int i)
{
return !(x & cur[i]);
} int cal(int x)
{
int res = 0;
while (x)
{
if (x & 1) res++;
x >>= 1;
}
return res;
} void input()
{
while (scanf("%d %d", &n, &m) != EOF) //输入
{
init();
memset(dp, 0, sizeof(dp)); for (int i = 0; i < n; i++)
{
scanf("%s", field[i]), cur[i] = 0;
for (int j = 0; j < m; j++)
if (field[i][j] == 'H') cur[i] += (1 << (m - j - 1)); //用于推断状态是否合法(1)
} for (int i = 0; i < tot; i++) //初始化第一行
{
if (!yes(state[i], 0)) continue;
for (int j = 0; j < tot; j++)
{
dp[0][i][j] = cal(state[i]);
}
} for (int i = 1; i < n; i++) //计算当前行,枚举上两行的状态
{
for (int j = 0; j < tot; j++) //枚举当前行的状态
{
if (!yes(state[j], i)) continue;
for (int k = 0; k < tot; k++)
{
if (!yes(state[k], i - 1)) continue;
for (int l = 0; l < tot; l++)
{
if (!yes(state[l], i - 2)) continue;
if (((state[j] & state[k]) == 0) && ((state[j] & state[l]) == 0) && ((state[k] & state[l]) == 0))
{
dp[i][j][k] = max(dp[i][j][k], dp[i - 1][k][l] + cal(state[j]));
}
}
}
}
} int ans = 0; //计算答案 for (int i = 0; i < tot; i++)
for (int j = 0; j < tot; j++)
ans = max(ans, dp[n - 1][i][j]); cout << ans << endl;
}
} int main()
{
input();
return 0;
}

poj1185炮兵阵地的更多相关文章

  1. [poj1185]炮兵阵地_状压dp

    炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...

  2. POJ1185炮兵阵地【动态规划】

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26892   Accepted: 10396 Descriptio ...

  3. poj1185 炮兵阵地【状压DP】

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 32802   Accepted: 12650 Descriptio ...

  4. POJ1185 炮兵阵地 —— 状压DP

    题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions ...

  5. POJ1185 炮兵阵地 和 POJ2411 Mondriaan's Dream

    炮兵阵地 Language:Default 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 34008 Accepted ...

  6. POJ1185 炮兵阵地

    题目描述 Description 司令部的将军们打算在N × M的网格地图上部署他们的炮兵部队.一个N × M的地图由N行M列组成,地图的每一格可能是山地(用"H"表示),也可能是 ...

  7. POJ1185 - 炮兵阵地(状态压缩DP)

    题目大意 中文的..直接搬过来... 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  8. POJ1185 炮兵阵地 状态压缩

    因为不知道不同的博客怎么转,就把别人的复制过来了,这个题解写的非常好,原地址为: http://hi.baidu.com/wangxustf/item/9138f80ce2292b8903ce1bc7 ...

  9. poj1185炮兵阵地 正确代码及错误代码分析

    Solution:状态压缩 因为设置炮兵的局限性(同行两炮兵相差要大于2),一行10个数最多有60种可能性(程序计算) 其中判断可能性的好方法是: if ((i & (i << 1 ...

随机推荐

  1. CURD演示 2

    <?php class UserAction extends Action{ public function index(){ echo "你好!"; $m=M('user' ...

  2. tc3162目录

    lsbin      dev      lib      proc     tmp      usrboaroot  etc      linuxrc  sbin     userfs   var# ...

  3. objective-C 中的内存管理解说

    初学objectice-C的朋友都有一个困惑,总觉得对objective-C的内存管理机制琢磨不透,程序经常内存泄漏或莫名其妙的崩溃.我在这里总结了自己对objective-C内存管理机制的研究成果和 ...

  4. POJ 1862 &amp; ZOJ 1543 Stripies(贪心 | 优先队列)

    题目链接: PKU:http://poj.org/problem?id=1862 ZJU:http://acm.zju.edu.cn/onlinejudge/showProblem.do?proble ...

  5. Common lisp菜鸟指南(译)

    Common lisp菜鸟指南(译) Common lisp菜鸟指南(译)

  6. 13、Cocos2dx 3.0游戏开发找小三之3.0中的Director :郝萌主,一统江湖

    重开发人员的劳动成果.转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/27706967 游戏中的基本元素 在曾经文章中.我们具 ...

  7. Setup SSH and SVN on Windows Server

    cygwin: install sshd, cygrunsrv http://lifehacker.com/205090/geek-to-live--set-up-a-personal-home-ss ...

  8. 黑马程序员:Java基础总结----类加载器

    黑马程序员:Java基础总结 类加载器   ASP.Net+Android+IO开发 . .Net培训 .期待与您交流! 类加载器 Java虚拟机中可以安装多个类加载器,系统默认三个主要类加载器,每个 ...

  9. 关于JAVA Project.waitfor()返回值是1

    Project.waitfor()返回值是1,找了很久从网上没有发现关于1的说明. 这时对源代码调试了一下,发现Project=null.而去根目录下点击被调用的bat文件发现也可以被正确执行. 这时 ...

  10. jQuery EasyUI API 中文文档 - 布局(Layout)

    <html> <head> <script src="jquery-easyui/jquery.min.js"></script> ...