poj1185炮兵阵地
#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炮兵阵地相关推荐
- POJ1185 炮兵阵地 状压DP
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31819 Accepted: 12295 Descriptio ...
- poj1185炮兵阵地【状压dp】
Language: Default 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 22142 Accepted ...
- POJ1185炮兵阵地(状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 33176 Accepted: 12787 Descriptio ...
- poj1185 炮兵阵地
Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用&quo ...
- POJ-1185 炮兵阵地 动态规划+状态压缩
由于递推的时候依赖于三个连续层的关系.一开始想着直接三重for循环,但是这里有个问题就是上一层的0位置上包括着上上层是0和1两种可能,而后者又对当前行有约束,因此该方法不行.当然有一个办法就是增加状态 ...
- POJ1185炮兵阵地(状态压缩 + dp)
题目链接 题意:给出一张n * m的地图,其中 有的地方能放大炮,有的地方不能,大炮与上下左右两个单位范围内会相互攻击,问最多能放几个大炮 能放大炮为1不能放大炮为0,把每一行看做一个状态,要除去同一 ...
- hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地
题意: 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Other ...
- POJ 1185 炮兵阵地 (状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14869 Accepted: 5575 Description ...
- poj 1185 NYOJ 85 炮兵阵地(状态压缩dp)
炮兵阵地 时间限制:2000 ms | 内存限制:65535 KB 难度:6 描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地 ...
最新文章
- EVT DVT PVT TP PP MP分别指哪个阶段
- 线性规划与网络流24题 负载平衡问题
- ZZULIOJ 计算两点间的距离(多实例测试)
- logistic回归 简介_从零实现机器学习算法(四)Logistic回归
- [Ext JS] Grid 的复选框行选择之——某些行不能选取
- 就9.5面试做个小结
- PHP三级联动视频教程,PHP教程:thinkPHP实现的省市区三级联动功能示例
- django返回json格式的数据的方法
- 二维叉乘求三角形面积_角形
- 生信过程中的各种文件格式
- 关闭windows电脑 ctrl +alt +方向键旋转屏幕快捷键
- matlab 提取文件路径名称 带后缀与不带后缀
- 计算机硬盘启动设置方法,如何进入BIOS设置硬盘启动顺序|计算机BIOS硬盘启动设置方法...
- GB/T 20984-2022《信息安全技术 信息安全风险评估方法》解读
- 安装两个虚拟机只为验证一个猜测,结果不出所料(Unity | deviceUniqueIdentifier | 设备ID相同)
- MySQL 爱生活群开放加入喽
- 中国北斗简单原理随笔
- go-micro使用Grpc
- 使用python实现一个简单的学生信息管理系统
- ​Mac下 VSCode快捷键 VSCode基本使用