《新手的DOTA》解题报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《新手的DOTA》解题报告

作者声明:

当动态规划维数进一步增大或不定时,标准解答方法为最大流。

新手的DOTA

By

sx349

[

题目背景]

DOTA是Defense

of

the

Ancients的缩写,是一个基于魔兽争霸的多人实时对战自定义地图,可以支持10个人同时连线游戏。DOTA以对立的两个小队展开对战,最多为5v5。每个玩家仅需要选择一个英雄,并通过控制该英雄来摧毁对方小队所守护的主要建筑(远古遗迹),以取得最终胜利。

[

题目描述]

A君是暴雪公司的忠实FANS,也算是个war3的老手了,自从接触到了DOTA之后,感觉这更适合自己这样的微操狂人。于是,A君拉上了四个死党,也开始接触DOTA了。

既然是新手,首先就是要熟悉一下界面、英雄……等等。在经过一番恶补之后,A君率先出师,随后大家也纷纷学成。接下来,就要进行实战演练拉。

五个新手立刻进入游戏,很不幸,他们下载了一张非AI版地图(这也是很多新手遇到的尴尬)。作为这个小团队的领导者,A 君决定,先来一局5V0(五英雄对零英雄),进行一次试练。

在整张地图上不仅有对方一拨拨的小兵,还有很多的野外中立兵。五个新手经过讨论,决定分别找出一条从自己老家(坐标为1,1)通往敌方老家(坐标为N,N)的路,一波RUSH直接结束战斗。显然,敌方老家是很难打得(尤其是有强大的通灵塔守护)。所以,他们希望英雄在路上能够尽可能多地MF,尽可能的练到更高等级。

假设我们已经知道了整张地图的大小N以及所有兵力配置(只是开了一下全地图可见……),五个英雄依次出发,每一次向右或向下移动一格,直到到达敌方的远古遗迹。如果某个地点已经被到达过,那么到达这一地点的英雄必然会杀死所有的处于该地点的单位,而且不再刷新。当然,由于我们的英雄等级都不会太高,所以每一格中的单位数量也不会超过10000个,不然的话……

A君想知道,他们这一波RUSH最多能解决掉多少单位?

[输入格式]

第一行是一个整数N,表示整张地图(正方形)的边长。

第二到N+1行,每行有N个数字,表示地图中每个点的兵力配置。

[输出格式]

输出一个整数S,表示最多能解决掉的单位。

[输入样例1]

3

1

2

3

2

3

4

3

4

5

[输出样例1]

27

//所有的单位都被解决了

[输入样例2]

2 5 6 7 9 1 6 4 8 6 8 4 1 6 9 8 4 8 1 6 8

1

6

9

8

7

4

6

3

8

4

1

3

1

[输出样例2]

181

//除了右上角的一个单位以外全部解决了

[数据范围]

对于50%的数据,有0x[i-1]时,x[i]必然与前i-1个X值不同,此时map[x[i],k+1-x[i]]也会被经过。将所有经过的点的单位数相加,即为pare函数的值。

到此为止,就是本道题核心算法的框架结构。

[程序清单]

program

dota;

const

maxn=10;

var

f:array[12*maxn-1,0maxn,0maxn,0maxn,0maxn,0maxn] of

integer;

i,j,k,x1,x2,x3,x4,x5,n:longint;

dx:array[132,15]

of

integer;

map:array[1maxn,1maxn]

of

integer;

procedure

pare(k,x1,x2,x3,x4,x5:longint);

var

x:array[15]

of

longint;

i,j,t:longint;

begin

x[1]:=x1;x[2]:=x2;x[3]:=x3;x[4]:=x4;x[5]:=x5; for

i:=1

to

4

do

for

j:=i+1

to

5

do

if

x[i]>x[j]

then

begin

t:=x[i];

x[i]:=x[j];

x[j]:=t;

end;

inc(f[k,x1,x2,x3,x4,x5],map[x[1],k+1-x[1]]); for

i:=2

to

5

do

if

x[i]x[i-1]

then

inc(f[k,x1,x2,x3,x4,x5],map[x[i],k+1-x[i]]); end;

begin

read(n);

for

i:=1

to

n

do

for

j:=1

to

n

read(map[i,j]); k:=0;

for

x1:=0

to

1

do

for

x2:=0

to

1

do

for

x3:=0

to

1

do

for

x4:=0

to

1

相关文档
最新文档