Description
Input
第一行为整数L,其中4<=L<=100000,且有50%的数据满足L<=104,表示木板下侧直线段的长。第二行为L个正整数A1,A2,…,AL,其中1
Output
仅包含一个整数D,表示为使梳子面积最大,需要从木板上挖掉的格子数。
Sample Input
9
4 4 6 5 4 2 3 3 5
Sample Output
3
太坑爹了,证明在这里
最终方案中的a'[i]只可能是a[j]+k{|i-j|<=2,|k|<=1}
然后直接dp就行了
1 var 2 a:array[0..100010]of longint; 3 f:array[0..100010,-2..2,-1..1,0..1]of int64; 4 h:array[0..100010,-2..2,-1..1]of longint; 5 n:longint; 6 ans:int64; 7 8 function min(x,y:int64):int64; 9 begin 10 if x<y then exit(x); 11 exit(y); 12 end; 13 14 procedure init; 15 var 16 i:longint; 17 begin 18 read(n); 19 for i:=1 to n do 20 read(a[i]); 21 ans:=1<<60; 22 fillchar(f,sizeof(f),122); 23 end; 24 25 procedure work; 26 var 27 i,j,k,j1,k1:longint; 28 begin 29 for j:=0 to 2 do 30 if 1+j<=n then 31 for k:=-1 to 1 do 32 if a[1+j]+k<=a[1] then 33 begin 34 h[1,j,k]:=a[1+j]+k; 35 f[1,j,k,0]:=a[1]-h[1,j,k]; 36 f[1,j,k,1]:=a[1]-h[1,j,k]; 37 end; 38 for i:=2 to n do 39 for j:=-2 to 2 do 40 if (i+j>0)and(i+j<=n) then 41 for k:=-1 to 1 do 42 if a[i+j]+k<=a[i] then 43 begin 44 h[i,j,k]:=a[i+j]+k; 45 for j1:=-2 to 2 do 46 for k1:=-1 to 1 do 47 if h[i-1,j1,k1]>h[i,j,k] then f[i,j,k,0]:=min(f[i,j,k,0],f[i-1,j1,k1,1]+a[i]-h[i,j,k]) 48 else 49 if h[i-1,j1,k1]<h[i,j,k] then f[i,j,k,1]:=min(f[i,j,k,1],f[i-1,j1,k1,0]+a[i]-h[i,j,k]) 50 else 51 begin 52 f[i,j,k,0]:=min(f[i,j,k,0],f[i-1,j1,k1,0]+a[i]-h[i,j,k]); 53 f[i,j,k,1]:=min(f[i,j,k,1],f[i-1,j1,k1,1]+a[i]-h[i,j,k]); 54 end; 55 end; 56 for j:=-2 to 0 do 57 for k:=-1 to 1 do 58 ans:=min(ans,min(f[n,j,k,0],f[n,j,k,1])); 59 write(ans); 60 end; 61 62 begin 63 init; 64 work; 65 end.