炮兵阵地 压缩DP
来源:互联网 发布:linux倒序 ll 编辑:程序博客网 时间:2024/04/30 15:17
炮兵阵地
时间限制:2000 ms | 内存限制:65535 KB
难度:6
- 描述
- 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:
如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。- 输入
- 第一行输出数据测试组数X(0<X<100)
接下来每组测试数据的第一行包含两个由空格分割开的正整数,分别表示N和M; 接下来的N行,每一行含有连续的M个字符('P'或者'H'),中间没有空格。按顺序表示地图中每一行的数据。0<=N <= 100;0<=M <= 10。 - 输出
- 每组测试数据输出仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。
- 样例输入
15 4PHPPPPHHPPPPPHPPPHHP
- 样例输出
6
反思: 1) 第i 行的状态 要关联到上x 行,那么就需要 x 维的数组去分别记录 i -1 行的状态, i- 2 行状态……i - x 行状态;
#include<stdio.h>#include<string.h>#include<math.h>#include<string>#include<iostream>#include<algorithm>#include<vector>#include<queue>#include<list>#include<map>#include<set>using namespace std;int n, m;int all;char pos[110][20];int dp[110][70][70];int kind[70];bool check(int x){ int t1 = x & (x >> 1); int t2 = x & (x >> 2); if(t1 + t2 == 0) return 1; else return 0;}bool OK(int x, int r){ for(int i = 0; i < m; i++){ if(pos[r][i] == 'H'){ int tp = (x >> (m - i - 1)) & 1; if(tp == 1) return 0; } } return 1;}int cal(int x){ int cnt = 0; while(x){ if(x & 1) cnt ++; x >>= 1; } return cnt;}int main(){freopen("in.txt","r",stdin); int T; scanf("%d", &T); while(T--){ scanf("%d%d", &n, &m); for(int i = 0; i < m; i ++) pos[0][i] = 'p'; for(int i = 1; i <= n; i ++) scanf("%s", pos[i]); all = 0; for(int x = 0; x < (1 << m); x ++){ if(check(x)) kind[all ++ ] = x; } memset(dp, 0, sizeof(dp)); for(int r = 1; r <= n; r ++){ for(int i = 0; i < all; i ++){ if(OK(kind[i], r) == 0) continue; for(int j = 0; j < all; j ++){ if(kind[j] & kind[i]) continue; for(int k = 0; k < all; k ++){ if((kind[k] & kind[i]) || (kind[k] & kind[j])) continue; dp[r][i][j] = max(dp[r][i][j], dp[r - 1][j][k] + cal(kind[i])); } } } } int ans = 0; for(int i = 0; i < all; i++){ for(int j = 0; j < all; j++) ans = max(ans, dp[n][i][j]); } cout << ans << endl; }return 0;}
0 0
- 炮兵阵地 压缩DP
- 【状态压缩DP】炮兵阵地
- 【dp-状态压缩】炮兵阵地
- Poj 1185 炮兵阵地 【状态压缩dp】
- dp专辑 H - 炮兵阵地 [ 状态压缩]
- poj 1185 炮兵阵地 //状态压缩DP
- 状态压缩DP poj1185 炮兵阵地
- POJ1185 炮兵阵地(压缩DP)
- POJ 1185 炮兵阵地 状态压缩(DP)
- POJ 1185 炮兵阵地 状态压缩DP
- POJ 炮兵阵地 1185 状态压缩dp
- poj1185 炮兵阵地 状态压缩dp
- poj 1185 炮兵阵地 状态压缩dp
- poj 1185 炮兵阵地 状态压缩DP
- poj 1185 炮兵阵地 状态压缩dp
- POJ 1185 炮兵阵地 状态压缩dp
- poj 1185 炮兵阵地 【状态压缩dp】
- POJ--1185--炮兵阵地--状态压缩DP
- bash系统变量
- 【Linux C 程序设计】(一)基础知识
- IAR软件不能使用Go to definition ...功能
- Verilog HDL编写SPI Slave通信
- POJ 3160 Father Christmas flymouse 强联通
- 炮兵阵地 压缩DP
- unity之光源,材质和预设体
- ios导航栏,状态栏自定义设计相关参数 (转)
- Photoshop脚本 > 另存当前文档
- NetBeans的(默认)快捷键
- 纯码农的尴尬
- Android 依赖注入函数库Roboguice(一)
- ubuntu12.04将当前终端的jdk环境临时切换到jdk1.7
- linux grep命令详解