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.