一道简单的PASCAL题

来源:百度知道 编辑:UC知道 时间:2024/06/04 07:53:41
将N个数分为K份,使这K分中的最大和最小
样例输入
5 2
1 2 3 4 5
样例输出
8

给个思路就行
垃圾递归别来骗分
(1<=K<=N<=1000)

一道很水的DP,我们用f1[i,j]表示1~I个数,分成j段的最小值,f2[i,j]表示1~I个数,分成j段的最大值,则我们进行状态转移:
f1[i,j] = Min(Max(f2[k, j - 1], a[k+1]+A[k+2]+..a[i]), j-1<=k<=i-1)
f2[i,j] = Max (Max(f2[k, j - 1], a[k+1]+A[k+2]+..a[i]), j-1<=k<=i-1)
解释:
1~i个数只考虑最好一段,设分成k+1~i,那么这k段中的最大数为Max(f1[k, j - 1], a[k+1]+A[k+2]+..a[i]),所以1~I个数,分成j段的最小值即为所有的k取得的最小值,至于f1, 不用解释
f1[n,k]为所求

var
a,x:array[0..1000] of longint;
p,j,n,k,i:integer;
ans:longint;

procedure Sort(l,s:integer);
var i,j:integer;
x,y:longint;
begin
i:=l; j:=s; x:=a[(l+s) div 2];
repeat
while a[i]<x do i:=i+1;
while x<a[j] do j:=j-1;
if i<=j then
begin
y:=a[i]; a[i]:=a[j]; a[j]:=y;
i:=i+1; j:=j-1;
end;
until i>j;
if l<j then sort(l,j);
if i<s then sort(i,s);
end;

begin
rea