3892: [Usaco2014 Dec]Marathon
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 169 Solved: 100
[Submit][Status][Discuss]
Description
Unhappy with the poor health of his cows, Farmer John enrolls them in an assortment of different physical fitness activities. His prize cow Bessie is enrolled in a running class, where she is eventually expected to run a marathon through the downtown area of the city near Farmer John's farm! The marathon course consists of N checkpoints (3 <= N <= 500) to be visited in sequence, where checkpoint 1 is the starting location and checkpoint N is the finish. Bessie is supposed to visit all of these checkpoints one by one, but being the lazy cow she is, she decides that she will skip up to K checkpoints (K < N) in order to shorten her total journey. She cannot skip checkpoints 1 or N, however, since that would be too noticeable. Please help Bessie find the minimum distance that she has to run if she can skip up to K checkpoints. Since the course is set in a downtown area with a grid of streets, the distance between two checkpoints at locations (x1, y1) and (x2, y2) is given by |x1-x2| + |y1-y2|.
Input
Output
Sample Input
0 0
8 3
1 1
10 -5
2 2
Sample Output
HINT
Source
题解:一道神奇的DP,b[i,j]代表从1到i,共计跳跃了j次不难得出递推式
\(b[i,j]=min(b[i-k-1,j-k]+dis(i-k-1,i))\)
,然后\(O\left(N{M}^{2} \right)\)瞎搞万事
1 /************************************************************** 2 Problem: 3892 3 User: HansBug 4 Language: Pascal 5 Result: Accepted 6 Time:808 ms 7 Memory:4148 kb 8 ****************************************************************/ 9 10 var 11 i,j,k,l,m,n:longint; 12 a:array[0..1000,1..2] of longint; 13 b:array[0..1000,0..1000] of longint; 14 function dis(x,y:longint):longint;inline; 15 begin 16 exit(abs(a[x,1]-a[y,1])+abs(a[x,2]-a[y,2])); 17 end; 18 function min(x,y:longint):longint;inline; 19 begin 20 if x<y then min:=x else min:=y; 21 end; 22 begin 23 readln(n,m); 24 for i:=1 to n do readln(a[i,1],a[i,2]); 25 fillchar(b,sizeof(b),-1); 26 b[1,0]:=0; 27 for i:=2 to n do 28 begin 29 for j:=0 to min(i-2,m) do 30 begin 31 b[i,j]:=maxlongint; 32 for k:=0 to j do 33 if b[i-k-1,j-k]<>-1 then 34 begin 35 b[i,j]:=min(b[i,j],b[i-k-1,j-k]+dis(i-k-1,i)); 36 end; 37 end; 38 end; 39 writeln(b[n,min(n-2,m)]); 40 end.