1734: 炮兵阵地
1734: 炮兵阵地
[命题人 :
#include <queue>
#include <math.h>
#include <stack>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <iomanip>
#include <string.h>
#include <algorithm>
using namespace std;
#define LL long long
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
int n , m;
int map[200][20] , fmap[105][200];
int dp[105][200][200];
int flag[N] , can[N] , cnt , num[N];
void init()
{int len = (1 << m) - 1;for(int i = 0 ;i <= len ; i++){int f1 = (i << 1) & i;int f2 = (i << 2) & i;if(!f1 && !f2){ flag[i] = 1;int k = i;while(k){num[cnt]++;k -= k&-k;}can[cnt++] = i;} }}
int main()
{cin >> n >> m;init();for(int i = 1 ; i <= n ; i++)for(int j = 1 ; j <= m ; j++){char c;cin >> c;if(c == 'P')map[i][j] = 1;}for(int i = 1 ; i <= n ; i++)for(int j = 0 ; j < cnt ; j++){int f = 1;int l = 1;int s = can[j];while(s){if( (s&1) && (map[i][l] == 0) ){f = 0;break;}s >>= 1;l++;}if(f)fmap[i][j] = 1;}int maxx = 0;for(int i = 0 ; i < cnt ; i ++)if(fmap[1][i])for(int j = 0 ; j < cnt ; j ++){dp[1][i][j] = num[i];maxx = max(maxx , num[i]);}for(int i = 0 ; i < cnt ; i ++)if(fmap[2][i])for(int j = 0 ; j < cnt ; j ++)if( (can[i] & can[j]) == 0){int kk = dp[2][i][j] = num[i] + dp[1][j][j];maxx = max(maxx , kk );}for(int k = 3 ; k <= n ; k++)for(int i = 0 ; i < cnt ; i++)if(fmap[k][i])for(int i1 = 0 ; i1 < cnt ; i1++){int nn = 0;if( (can[i] & can[i1]) == 0){for(int i2 = 0 ; i2 < cnt ; i2++){if ( (can[i] & can[i2])== 0 && (can[i2] & can[i1]) == 0 )nn = max(nn , num[i] + dp[k-1][i1][i2]);}}dp[k][i][i1] = nn;maxx = max(nn , maxx);}cout << maxx << endl;return 0;
}
]
时间限制 : 1.000 sec 内存限制 : 128 MB
提交解决: 9提交量: 14统计
题目描述
原题来自:NOI 2001
司令部的将军们打算在 N\times MN×M 的网格地图上部署他们的炮兵部队。一个 N\times MN×M 的地图由 NN 行 MM 列组成,地图的每一格可能是山地(用 H 表示),也可能是平原(用 P 表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:
如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。
现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。
输入
第一行包含两个由空格分割开的正整数,分别表示 NN 和 MM;
接下来的 NN 行,每一行含有连续的 MM 个字符(P 或者 H),中间没有空格。按顺序表示地图中每一行的数据。
输出
仅一行,包含一个整数 KK,表示最多能摆放的炮兵部队的数量。
样例输入 Copy
5 4 PHPP PPHH PPPP PHPP PHHP
样例输出 Copy
6
提示
数据范围与提示
N \le 100, M \le 10N≤100,M≤10。
来源/分类
ybttg DP 状态压缩
提交讨论版
1734: 炮兵阵地相关推荐
- POJ 1185 炮兵阵地 (状压DP)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 14869 Accepted: 5575 Description ...
- hdu4539 郑厂长系列故事——排兵布阵 + POJ1158 炮兵阵地
题意: 郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Other ...
- poj 1185 NYOJ 85 炮兵阵地(状态压缩dp)
炮兵阵地 时间限制:2000 ms | 内存限制:65535 KB 难度:6 描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地 ...
- POJ1185 炮兵阵地 状压DP
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 31819 Accepted: 12295 Descriptio ...
- 状压dp之二之三 炮兵阵地/玉米田 By cellur925
一.简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ ...
- C++ 洛谷 P2704 [NOI2001]炮兵阵地
P2704 [NOI2001]炮兵阵地 没学状压DP的看一下 此题意思很简单,如下图,就是十字架上的不能有两个点放炮兵. 在做此题前,先做一下玉米田 玉米田题解 分析: 而m即一行的个数小于等于10, ...
- AcWing292.炮兵阵地(状压DP)题解
Acwing.炮兵阵地 题目传送门 题目描述 司令部的将军们打算在N * M的网格地图上部署他们的炮兵部队.一个N * M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表 ...
- POJ 1185 炮兵阵地(动态规划+状态压缩)
炮兵阵地 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原( ...
- NYOJ 81:炮兵阵地(状压DP)
炮兵阵地 时间限制:2000 ms | 内存限制:65535 KB 难度:6 描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地 ...
最新文章
- 赠书 | 手把手教你自己动手打造一个智能恒温器
- IOS使用Instrument-Time Profiler工具分析和优化性能问题
- easyui panel 默认折叠 右上角按钮
- 一个简单遮罩弹窗效果
- 生产路由跳转报错找不到js路径问题
- java定时器偶尔重复推送_在Java中创建重复的定时器提醒
- 某android平板项目开发笔记--自定义sharepreference UI
- 我是一名普通程序员,通过自己的努力,我的收入涨了3倍!
- 您在2016年OpenStack峰会上错过的事情
- php榛子云短信验证,java + maven +榛子云短信 实现发送短信验证码功能
- 一个IT时代的终结:109岁的IBM将分拆为两家公司
- LMS Virtual Lab对发动机噪声进行仿真的2种方法
- 算法63----丑数【动态规划】
- [翻译]A MAP BASED ON LASERSCANS WITHOUT GEOMETRIC INTERPRETATION
- win10设置mysql环境变量
- 三极管电路限流电阻如何选择
- 关于南京市大学生办理住房补贴的流程示意图
- 汽车电子控制器(ECU)的硬件设计流程
- 树莓派Win10镜像下载安装教程及使用初体验
- ansys怎么批量输入点坐标_AUTO CAD批量输入坐标的技巧