POJ1991 Turning in Homework——贪心+动态规划——Pku1991

贪心+ 动态规划。

贪心思想:当有一段连续区间[i,j]未交时,取i或j是最优的。

贪心思想证明:如果在[i,j]这段连续区间都没有被取的时候取了中间的m,那么后来一定要从m返回到i或者j,这时候是一定走了“冤枉路的”。而如果这时取了i或者j,那么到中间的时候m一定可以取。证毕。

动态规划的方程这时候就简单了:

f[i,j,0]表示[i+1,j]这一段连续区间都没有取,奶牛站在i上

f[i,j,1]表示[i,j-1]这一段连续区间都没有取,奶牛站在j上

方程:

f[i,k,0]:=Min(Max(f[i-1,k,0]+a[i]-a[i-1],time[i]),Max(f[i,k+1,1]+a[k+1]-a[i],time[i]));

f[i,k,1]:=Min(Max(f[i-1,k,0]+a[k]-a[i-1],time[k]),Max(f[i,k+1,1]+a[k+1]-a[k],time[k]));

其中,k=n,或者i=1的情况要特判一下,否则会越界。

CODE

 1 Program POJ1991;//By_Poetshy
2 Const
3 maxn=1000;
4 Var
5 i,j,k,m,n,b,ans,tmp :Longint;
6 time,a :Array[1..maxn]of Longint;
7 f :Array[1..maxn,1..maxn,0..1]of Int64;
8
9 Function Max(i,j:Int64):Int64;
10 begin
11 if i>j then exit(i);exit(j);
12 end;
13
14 Function Min(i,j:Int64):Int64;
15 begin
16 if i<j then exit(i);exit(j);
17 end;
18
19 Procedure Qsort(l,r:Longint);
20 var i,j,k,temp:Longint;
21 begin
22 i:=l;j:=r;
23 k:=a[(i+j)>>1];
24 repeat
25 while a[i]<k do inc(i);
26 while a[j]>k do dec(j);
27 if i<=j then
28 begin
29 temp:=a[i];a[i]:=a[j];a[j]:=temp;
30 temp:=time[i];time[i]:=time[j];time[j]:=temp;
31 inc(i);dec(j);
32 end;
33 until i>j;
34 if i<r then Qsort(i,r);
35 if l<j then Qsort(l,j);
36 end;
37
38 BEGIN
39 readln(n,m,b);
40 for i:=1 to n do readln(a[i],time[i]);
41 Qsort(1,n);
42 f[1,n,0]:=Max(time[1],a[1]);f[1,n,1]:=Max(time[n],a[n]);
43 for j:=n-2 downto 0 do
44 for i:=1 to n-j do
45 begin
46 k:=i+j;
47 if k=n then
48 begin
49 f[i,k,0]:=Max(f[i-1,k,0]+a[i]-a[i-1],time[i]);
50 f[i,k,1]:=Max(f[i-1,k,0]+a[k]-a[i-1],time[k]);
51 end else if i=1 then
52 begin
53 f[i,k,0]:=Max(f[i,k+1,1]+a[k+1]-a[i],time[i]);
54 f[i,k,1]:=Max(f[i,k+1,1]+a[k+1]-a[k],time[k]);
55 end else
56 begin
57 f[i,k,0]:=Min(Max(f[i-1,k,0]+a[i]-a[i-1],time[i]),Max(f[i,k+1,1]+a[k+1]-a[i],time[i]));
58 f[i,k,1]:=Min(Max(f[i-1,k,0]+a[k]-a[i-1],time[k]),Max(f[i,k+1,1]+a[k+1]-a[k],time[k]));
59 end;
60 end;
61 ans:=Maxlongint;
62 for i:=1 to n do
63 begin
64 if f[i,i,0]+abs(a[i]-b)<ans then ans:=f[i,i,0]+abs(a[i]-b);
65 if f[i,i,1]+abs(a[i]-b)<ans then ans:=f[i,i,1]+abs(a[i]-b);
66 end;
67 writeln(ans);
68 END.

你可能感兴趣的:(动态规划)