BZOJ P1207 打鼹鼠

  首先分析题目,题目中给出说明,时间按递增顺序给出。并且数据范围是M = 10000。那么我们可以考虑用最长上升子序列来解决。

  设 F[i] 代表 到第i个鼹鼠前所能打到的鼹鼠的最大值。i从2枚举到n,在内层从1到i - 1枚举j,那么通过j转移到i的满足条件为:i 到 j 的曼哈顿距离 abs(x[j] - x[i]) + abs(y[j] - y[i])小于鼹鼠出现时间的差(time[i] - time[j]),因为机器人每次只能移动一步。

 

下面附上代码

 1 //By Neil
 2 const
 3     maxM                        =10000 + 10;
 4 type
 5     map                         =record
 6     t,x,y                       :longint;
 7     end;
 8 var
 9     a                           :array[0..maxM] of map;
10     i,j,k                       :longint;
11     n,m                         :longint;
12     f                           :array[0..maxM] of longint;
13     ans                         :longint;
14 procedure  swap(var x,y:map);
15 var
16     tmp                         :map;
17 begin
18     tmp := x;
19     x := y;
20     y := tmp;
21 end;
22 function  max(x,y :longint):longint;
23 begin
24   if x > y then exit(x) else exit(y);
25 end;
26 
27 procedure  init;
28 begin
29   read(n,m);
30   for i := 1 to m do
31     read(a[i].t,a[i].x,a[i].y);
32 end;
33 
34 procedure  main;
35 var
36     i,j                    :longint;
37 begin
38   for i := 1 to m do
39     begin
40       f[i] := 1;
41       for j := 1 to i - 1 do
42         if (abs(a[j].x - a[i].x) + abs(a[j].y - a[i].y) <= a[i].t - a[j].t) then
43             f[i] := max(f[i],f[j] + 1);
44       ans := max(ans,f[i]);
45     end;
46   writeln(ans);
47 
48 
49 end;
50 begin
51   init;
52   main;
53 end.

 

posted @ 2014-02-13 10:00  Jo-Neil  阅读(172)  评论(0编辑  收藏  举报