#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;   //阵地列状态的压缩总数,合法状态总数最多60int 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; }

转载于:https://www.cnblogs.com/mengfanrong/p/5142755.html

poj1185炮兵阵地相关推荐

  1. POJ1185 炮兵阵地 状压DP

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

  2. poj1185炮兵阵地【状压dp】

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

  3. POJ1185炮兵阵地(状压DP)

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

  4. poj1185 炮兵阵地

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

  5. POJ-1185 炮兵阵地 动态规划+状态压缩

    由于递推的时候依赖于三个连续层的关系.一开始想着直接三重for循环,但是这里有个问题就是上一层的0位置上包括着上上层是0和1两种可能,而后者又对当前行有约束,因此该方法不行.当然有一个办法就是增加状态 ...

  6. POJ1185炮兵阵地(状态压缩 + dp)

    题目链接 题意:给出一张n * m的地图,其中 有的地方能放大炮,有的地方不能,大炮与上下左右两个单位范围内会相互攻击,问最多能放几个大炮 能放大炮为1不能放大炮为0,把每一行看做一个状态,要除去同一 ...

  7. hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地

    题意: 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Other ...

  8. POJ 1185 炮兵阵地 (状压DP)

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 14869   Accepted: 5575 Description ...

  9. poj 1185 NYOJ 85 炮兵阵地(状态压缩dp)

    炮兵阵地 时间限制:2000 ms  |  内存限制:65535 KB 难度:6 描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地 ...

最新文章

  1. EVT DVT PVT TP PP MP分别指哪个阶段
  2. 线性规划与网络流24题 负载平衡问题
  3. ZZULIOJ 计算两点间的距离(多实例测试)
  4. logistic回归 简介_从零实现机器学习算法(四)Logistic回归
  5. [Ext JS] Grid 的复选框行选择之——某些行不能选取
  6. 就9.5面试做个小结
  7. PHP三级联动视频教程,PHP教程:thinkPHP实现的省市区三级联动功能示例
  8. django返回json格式的数据的方法
  9. 二维叉乘求三角形面积_角形
  10. 生信过程中的各种文件格式
  11. 关闭windows电脑 ctrl +alt +方向键旋转屏幕快捷键
  12. matlab 提取文件路径名称 带后缀与不带后缀
  13. 计算机硬盘启动设置方法,如何进入BIOS设置硬盘启动顺序|计算机BIOS硬盘启动设置方法...
  14. GB/T 20984-2022《信息安全技术 信息安全风险评估方法》解读
  15. 安装两个虚拟机只为验证一个猜测,结果不出所料(Unity | deviceUniqueIdentifier | 设备ID相同)
  16. MySQL 爱生活群开放加入喽
  17. 中国北斗简单原理随笔
  18. go-micro使用Grpc
  19. 使用python实现一个简单的学生信息管理系统
  20. ​Mac下 VSCode快捷键 VSCode基本使用

热门文章

  1. 低秩矩阵的应用--背景建模
  2. 图像拼接 Image-based only, no GPS/IMU data
  3. Q767 重构字符串
  4. centos7安装redmine3.4
  5. 【bzoj1029】【JSOI2007】建筑抢修
  6. lua 代码加密方案
  7. zTree实现单独选中根节点中第一个节点
  8. 第二阶段个人总结06
  9. TCP三次握手及四次挥手详细图解
  10. OpenGL 字体颜色问题