- 1、本文档共14页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
POJ1185炮兵阵地
1185 炮兵阵地 李瑞超 题目简介 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队。一个N*M的地图由N行M列组成,地图的每一格可能是山地(用H 表示),也可能是平原(用P表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 题目简介(续一) 题目简介(续二) 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。 现在,将军们规划如何部署炮兵部队,在防止误伤的前提下(保证任何两支炮兵部队之间不能互相攻击,即任何一支炮兵部队都不在其他支炮兵部队的攻击范围内),在整个地图区域内最多能够摆放多少我军的炮兵部队。 输入要求 第一行包含两个由空格分割开的正整数,分别表示N和M; 接下来的N行,每一行含有连续的M个字符(P或者H),中间没有空格。按顺序表示地图中每一行的数据。N = 100;M = 10。 输出要求 仅一行,包含一个整数K,表示最多能摆放的炮兵部队的数量。 Sample Input 5 4 P H P P P P H H P P P P P H P P P H H P Output 6 题目分析 MAX MMAX N 由此自然想到逐行向下扫描,考虑到第i行大炮的放置对第i+3行的大炮没有任何影响,这就决定了我们可以用有限的状态数来描述某一行的所有可能情况,因此动态规划成为选择。决定了基本算法,下面选择状态。 状态处理 如果我们采用3进制方式来表示一行的所有状态,那么会有每行会有3^M个状态,加上要重复扫描N次。因此在最坏情况下(M=10,N=100,所有地点都是平原),会扫描到所有的3^10*100个状态,加上每个状态会被多次扫描到,因此不十分可取。 具体选择 分析一个列为10(M的最大值)的表。注意到一个全为P的空列上一共也只有60种合法的Cannon放置方法。具体对一个列数为10的PH表而言,对每一列也只有前两列对其产生影响,因此我们可以用一个二维数组cal [lm] [lm]来记录其上一行处于第x种状态,该行自身出于第y种状态时,从首行扫描到该行时所能存放的最多cannon数。其中lm是列数为M时一列的所有可能合法放置方法,x、y在0到lm-1之间。 基本数据结构 Pre[60][60],now[60][60] 对新行进行扫描时 for(i=0;ilm;i++)for(j=0;jlm;j++) for(k=0;klm;k++){ 如果当前行,前一行,前二行分别是第i,j,k个状态,并且都能够相容。而now [j] [i]pre [k] [j]+第i个状态新增的cannon数。那么更新now [j] [i]。 } 算法加速 有很多,可以同时实现也可以分别实现。 可以预先判断出2种状态是否相容,这样循环扫描时可以直接剪枝。 可以预先判断出第i行和第j种状态是否相容。 自己定义某种快速映射去判断。 时空代价 时间代价 O(N*lm*lm*lm) 空间代价 O(lm*lm) * *
文档评论(0)