问题

还是宇宙时间公元 5.5 5.5亿年, maxingc maxingc maxingc maxingc联盟用微子来攻击 yunyunyun联盟。愤怒的 yunyun 联盟决定反戈一击,他们 准备使用加农炮来反击。
yunyun 联盟的将军们打算在 N*M 的网格地图上部署他们炮兵队。一个 的网格地图上部署他们炮兵队。一个 N*M 的地图由 N行 M列组成,地 列组成,地 图的每一格可能是山地(用 图的每一格可能是山地(用 "H" "H" 表示),也可能是平原(用 表示),也可能是平原(用 表示),也可能是平原(用 表示),也可能是平原(用 "P" "P"表示),如下图。在每一格平原 表示),如下图。在每一格平原 表示),如下图。在每一格平原 表示),如下图。在每一格平原 地形上最多可 以布置一支炮兵部队(山地上不能够署);在图的攻击范围如中黑色区域所 以布置一支炮兵部队(山地上不能够署);在图的攻击范围如中黑色区域所 以布置一支炮兵部队(山地上不能够署);在图的攻击范围如中黑色区域所 以布置一支炮兵部队(山地上不能够署);在图的攻击范围如中黑色区域所 示:

如果在地图中的灰色所标识平原上部署一支炮兵队,则黑网格表示它能够攻击到区域:沿横向左右各两格,纵上下。图其它白色网均攻击不到从可见炮兵的范围受地形的影响。 现在,将军们规划如何部署炮兵队防止误伤的 前提下(保证任何两支炮兵部队之间不能互相攻击, 即任何一支炮 兵部队都不在其他的攻击范围内),整个地图区域最多能够摆放少我军即任何一支炮 兵部队都不在其他的攻击范围内),整个地图区域最多能够摆放少我军即任何一支炮 兵部队都不在其他的攻击范围内),整个地图区域最多能够摆放少我军兵部队。
第一行包含两个由空格分割开的正整数,别表示 N和 M; 接下来的 N行,每一含有连续的 行,每一含有连续的 M个字符 ('P'('P' 或者 'H') 'H') ,中间没有空格。 按顺序表示地图每一行的数据,中间没有空格。 按顺序表示地图每一行的数据,中间没有空格。 按顺序表示地图每一行的数据,中间没有空格。 按顺序表示地图每一行的数据N <= 100= 100= 100 ;M <= 10 。
仅一行,包含个整数 K,表示最多能摆放的炮兵部队数量。
分析

这个题的n<=100 ,m<=10。如果盲目搜索,肯定会超时。

由于m<=10,所以每一行的状态可以用二进制表示,放置炮兵记为1,不放置记为0。

每一行的状态只和前两行的状态有关系,所以有方程:

F[i,k1,k2]=Max{f[i-1,k2,k3]+num[k1]},其中i为行数,k1表示第i行的状态,k2表示第i-1行的状态,k3表示第i-2行的状态,num[k1]为k1状态下可放置炮兵的个数。

i,k1,k2,k3必须满足一定的关系(炮兵之间不能相互攻击,且炮兵不能放在山地上)。

1

第i行放第k1种状态,第i-1行放第k2种状态,会不会出现矛盾

对于状态a[k1]和a[k2],如果他们是可行的,讨论他们每个对应的位置

a[k1]如果某位置是1,a[k2]这位上必须是0

a[k1]如果某位置是0,a[k2]这位上可以是1,也可以是0

所以可以归纳出 a[k1] and a[k2]=0,这要判断矛盾可以使速度大大提高

2.

对于每一行,第i种状态能不能放上去,即要求不能在‘H’的地方放士兵

我们可以先把每行原来的初始状态也表示出来,但是这里有个小技巧,把‘H’的地方记录下来

这行如果某位置是1,那么在a[k1]中这个位置上必须为0(1代表这里是山地)

这行如果某位置是0,那么在a[k1]中这个位置上可以为1,可以为0(0代表这里是平原)

所以可以归纳出 now[i] and a[k1]=0(now数组表示地形的状态)。

3.

我们可以提前枚举每种状态,把本身一行中可以相互攻击的状态删去,对于每一行进行操作时,需要将其转化成字符串,否则对一个二进制串很难操作。

此时f数组下表表示的是此状态在状态数组a中的位置。

View Code

program liukeke;
var
now:array[0..101] of longint;
a,b:array[0..102] of longint;
f:array[0..100,0..102,0..102] of longint;
n,m,i,k1,k2,k3,ans,j,tt,sum:longint;
s:string;
flag:boolean;

function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;

procedure init;
var
i,j:longint;
ch:char;
begin
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(ch);
if ch='H' then
now[i]:=now[i] + (1<<(m-j));
end;
readln;
end;
end;

function change(x:longint):string;
begin
change:='';
while x>0 do
begin
change:=chr(x mod 2+48)+change;
x:=x div 2;
end;
end;

begin
assign(input,'connon.in');
reset(input);
assign(output,'connon.out');
rewrite(output);
init;
for i:=0 to (1<<m)-1 do
begin
tt:=0;
flag:=false;
s:=change(i);
while length(s)<m do s:='0'+s;
for j:=1 to m do
if s[j]='1' then
begin
if s[j+1]='1' then begin flag:=true; break; end;
if s[j+2]='1' then begin flag:=true; break; end;
inc(tt);
end;
if not flag then
begin
inc(sum);
a[sum]:=i;
b[sum]:=tt;
end;
end;
for i:=1 to sum do
f[1,i,1]:=b[i];
for i:=2 to n do
for k1:=1 to sum do
for k2:=1 to sum do
if (a[k1] and a[k2]=0)and(a[k1] and now[i]=0)and(a[k2] and now[i-1]=0)then
for k3:=1 to sum do
if (a[k1] and a[k3]=0)and(a[k2] and a[k3]=0)and(a[k3] and now[i-2]=0)then
f[i,k1,k2]:=max(f[i,k1,k2],f[i-1,k2,k3]+b[k1]);
for i:=1 to sum do
for j:=1 to sum do
if (a[i]and a[j]=0)and(a[i] and now[n]=0)and(a[j] and now[n-1]=0)then
ans:=max(ans,f[n,i,j]);
writeln(ans);
close(input);
close(output);
end.

转载于:https://www.cnblogs.com/liukeke/archive/2011/06/12/2079058.html

【动态规划】炮兵阵地相关推荐

  1. POJ 1185 炮兵阵地(动态规划+状态压缩)

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

  2. POJ1185 炮兵阵地 状压DP

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

  3. 【状态dp】poj 1185 炮兵阵地(三维dp)

    poj 1185 炮兵阵地 http://poj.org/problem?id=1185 问题描述:给你一个n行m列的P-H矩阵,H表示不能安置炮兵,1可以安置炮兵,要求炮兵攻击管辖内不能在安置其他炮 ...

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

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

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

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

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

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

  7. 状压dp之二之三 炮兵阵地/玉米田 By cellur925

    一.简单的状压dp 玉米田 题目描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ ...

  8. C++ 洛谷 P2704 [NOI2001]炮兵阵地

    P2704 [NOI2001]炮兵阵地 没学状压DP的看一下 此题意思很简单,如下图,就是十字架上的不能有两个点放炮兵. 在做此题前,先做一下玉米田 玉米田题解 分析: 而m即一行的个数小于等于10, ...

  9. AcWing292.炮兵阵地(状压DP)题解

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

  10. NYOJ 81:炮兵阵地(状压DP)

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

最新文章

  1. vs增量链接、清单文件
  2. JAVA常见算法题(三十二)---找规律
  3. 12月5日 第二冲刺周期个人站立会议内容报告(第五天)
  4. 今日代码(200624)--缺失值处理
  5. MATLAB绘制正弦波、方波、三角波、锯齿波的mif文件
  6. 最简单的图形用户代码_简单几句代码,画出精美的图形,快跟着学起来~
  7. 计算机专业本科毕业答辩问题及回答
  8. spring mvc ajax登录验证,vuejs (前端项目) + spring mvc(后台项目),每次ajax请求都是新的session Id...
  9. 红包算法——最大最小值范围
  10. 利用EEPROM实现arduino的断电存储
  11. 果园机器人作文开头_果园机器人作文
  12. java中long最大值源码表示_通过JDK源码角度分析Long类详解
  13. html table td 居中显示,table td怎么垂直居中显示 详解table中如何隐藏td?
  14. COPY NAV导航网格寻路(4) -- 生成nav网格
  15. Vue中created()与activated()区别
  16. #论文阅读CTG The Use of Convolutional Neural Networks in Biomedical Data Processing
  17. R语言STAMP-丰度差异比较图
  18. 《系统集成项目管理工程师》必背100个知识点-68招投标流程
  19. Java核心技术【卷一】——学习笔记(五)--泛型(一)
  20. python怎么返回布尔值_尝试从函数返回布尔值

热门文章

  1. 指数哥伦布编码 java_H.264学习笔记6——指数哥伦布编码
  2. antv图例出现分页_2020,贴地飞行的 AntV 设计
  3. 在.NET2.0中如何更简单的使用委托将方法加载到事件中去
  4. JAVA学习笔记系列4-Eclipse版本选择
  5. 酷欧天气(CoolWeather)应用源码
  6. 【ObjectC—浅copy和深copy】
  7. 关于java类型数据组的调用
  8. MyEclipse + Maven开发Web工程的详细配置过程
  9. CentOS 5.4 下配置FTP服务器 [转帖]
  10. javascript事件模型框架