3519 炮兵阵地【状态压缩动态规划】.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
3519 炮兵阵地【状态压缩动态规划】

炮兵阵地【状态压缩动态规划】 Time Limit:1000MS? Memory Limit:65536K Total Submit:60 Accepted:42 Description 炮兵阵地(cannon.pas/c/cpp) 【问题描述】   司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:   如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。   现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。 Input   文件的第一行包含两个由空格分割开的正整数,分别表示N和M;   接下来的N行,每一行含有连续的M个字符(‘P’或者‘H’),中间没有空格。按顺序表示地图中每一行的数据。 N≤100;M≤10。 Output   文件仅在第一行包含一个整数K,表示最多能摆放的炮兵部队的数量。 Sample Input 5 4 PHPP PPHH PPPP PHPP PHHP Sample Output 6 Hint 状态压缩经典案例 Source NOI2001 type arr=array[0..11] of integer; var n,m,l:integer; a:array[1..100] of arr; data,s:arr; b:array[0..100,0..60,0..11] of integer; line:array[0..100] of integer; f:array[0..100,0..60,0..60] of longint; f2:array[-4..60] of longint; q:array[0..60] of arr; procedure dfs(v:integer); var i,ans:longint; begin if data[v]=1 then begin dfs(v+1); exit; end; if vm then begin inc(l); q[l]:=s; ans:=0; for i:=1 to m do ans:=ans+s[i]; q[l][0]:=ans; exit; end; s[v]:=0; dfs(v+1); s[v]:=1; if v=m-3 then dfs(v+3) else dfs(m+1); s[v]:=0; end; function check(s,x,y,p:longint):boolean; var i:longint; begin for i:=1 to m do if (b[s,x,i]=1) and (b[s-p,y,i]=1) then exit(false); exit(true); end; function max(a,b:longint):longint; begin if a=b then exit(a) else exit(b); end; procedure init; var i,j,k,s:integer; maxx:longint; c:char; begin readln(n,m); for i:=1 to n do begin for j:=1 to m do begin read(c); if c=H then a[i,j]:=1; end; readln; end; for i:=1 to n do begin data:=a[i]; l:=0; dfs(1); line[i]:=l; b[i]:=q; end; if n=1 then begin for i:=1 to m do begin f2[i]:=f2[i-1]; if a[1,i

文档评论(0)

shenlan118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档