经典DP——建学校(乘积最大)
pascal吧
全部回复
仅看楼主
level 11
说明:本渣对DP一知半解 只求最简单的理解方法
大神请进
2015年07月28日 07点07分 1
level 11
用搜索做也错,真是太失败了[狂汗]
(也不是说不可以)
那个DP公式好难求啊[冷](大神勿吐槽) 谁能告诉我一些方法[乖](比如说本题)
2015年07月28日 07点07分 3
level 11
这是标程
var n,k,i,x,j,v:longint;
a:array[1..101] of longint;
dis:array[1..101] of longint;
f:array[1..101,1..101] of longint;
function ok(x,y:longint):longint;
var min,i,t,j:longint;
begin
min:=maxlongint;
for i:=x to y do begin
t:=0;
for j:=x to y do t:=t+abs(dis[j]-dis[i])*a[j];
if t<min then min:=t;
end;
exit(min);
end;
begin
readln(n,k);
for i:=1 to n do read(a[i]);
for i:=2 to n do begin
read(x);
dis[i]:=dis[i-1]+x;
end;
for i:=1 to n do f[i,1]:=ok(1,i);
for j:=2 to k do begin
for i:=j to n do begin
f[i,j]:=f[i-1,j-1];
for v:=j to i-1 do begin
if f[v-1,j-1]+ok(v,i)<f[i,j] then
f[i,j]:=f[v-1,j-1]+ok(v,i);
end;
end;
end;
writeln(f[n,k]);
end.
2015年07月28日 07点07分 4
level 11
f[i,j]表示前i个村庄 建j个学校 距离和的最小值
然后,然后。。。。。
2015年07月28日 07点07分 5
1