这道题.....感觉很难,主要是我觉得很难弄出方程式;
方程式为f[i,j]=min(f[i-2,j-1]+s[i,j],f[i-1,j]);
表示第j组到第i个人的残疾指数的最小值。
注意每次for 次数的时候,直接for 到 i div 3就可以了,之后就没有意义了。
1 program P1061; uses math; 2 var 3 i,j,k,l,m,n,x:longint; 4 s:array[1..5500] of longint; 5 f:array[-1..5500,0..2000] of longint; 6 begin 7 {assign(input,'haha.in'); 8 reset(input);} 9 read(m,n); 10 for i:=n downto 1 do 11 read(s[i]); 12 close(input); 13 for j:=1 to m do 14 for i:=1 to n do 15 f[i,j]:=maxlongint; 16 for i:=1 to n do 17 for j:=1 to i div 3 do 18 begin 19 f[i,j]:=min(f[i-2,j-1]+sqr(s[i]-s[i-1]),f[i-1,j]); 20 end; 21 x:=maxlongint; 22 for i:=1 to n do 23 if x>f[i,m] then x:=f[i,m]; 24 write(f[n,m]); 25 end.