[Vijos 飞翔]

[题目来源]:vijso@潘帕斯雄鹰生日模拟赛T1

[关键字]:动态规划

[题目大意]:一个n*m的矩形,从(1,1)飞到(n,m),中间有些格子可以沿对角线穿过,问最短。

//=====================================================================================================

[分析]:首先可以明确地,要是有可以抄近路的格子则一定走它会更优,所以只要找到沿途可以经过的最多的这样的格子,再用总共要路过的格子减然后计算。而找最多的这样的格子就是找一个x和y都上升的最长格子序列,就是最长上升序列。

[代码]:

View Code
 1 type
2 rec = record
3 x, y: longint;
4 end
5 var
6 n, m, k, max, ans: longint;
7 h: array[0..2000] of longint;
8 a: array[0..2000] of rec;
9
10 procedure init;
11 var
12 i: longint;
13 begin
14 readln(m,n);
15 readln(k);
16 for i := 1 to k do
17 readln(a[i].x,a[i].y);
18 end;
19
20 procedure work;
21 var
22 i, j: longint;
23 begin
24 for i := 1 to k do h[i] := 1;
25 for i := 1 to k do
26 for j := i to i-1 do
27 if (a[j].x < a[i].x) and (a[j].y < a[i].y) and (h[j]+1 > h[i]) then
28 begin
29 h[i] := h[j]+1;
30 if max < h[i] then max := h[i];
31 end;
32 ans := round(max*sqrt(2)*100+100*((n-max)+(m-max)));
33 writeln(ans);
34 end;
35
36 begin
37 init;
38 work;
39 end.



你可能感兴趣的:(OS)