题面:
思路:
DP,f[i,j]表示到i点取j双的最优值
代码:
var n,k,i,j:longint; f:Array[0..1005,0..1005] of longint; a:array[0..1005] of longint; procedure sort(l,r: longint); var i,j,x,y: longint; begin i:=l; j:=r; x:=a[(l+r) div 2]; repeat while a[i]<x do inc(i); while x<a[j] do dec(j); if not(i>j) then begin y:=a[i]; a[i]:=a[j]; a[j]:=y; inc(i); j:=j-1; end; until i>j; if l<j then sort(l,j); if i<r then sort(i,r); end; function min(x,y:longint):longint; begin if x<y then exit(x) else exit(y); end; begin assign(input,'chop.in'); reset(input); assign(output,'chop.out'); rewrite(output); read(n,k); inc(k,3); if n<k*2 then begin writeln(-1); exit; end; for i:=1 to n do read(a[i]); sort(1,n); fillchar(f,sizeof(f),127); f[0,0]:=0; for i:=2 to n do for j:=1 to k do f[i,j]:=min(f[i-1,j],f[i-2,j-1]+sqr(a[i]-a[i-1])); writeln(f[n,k]); close(input);close(output); end.