【
样例数据说明】
输入说明:FJ带了5头奶牛出门。如果是单独把木筏划过河,FJ需要花10分钟,带上
1头奶牛的话,是13分钟,2头奶牛是17分钟,3头是23分钟,4头是123分钟,将5头一次性载过去,花费的时间是124分钟。
输出说明:Farmer John第一次带3头奶牛过河(23分钟),然后一个人划回来(10分钟),最后带剩下的2头奶牛一起过河(17分钟),总共花费的时间是23+10+17 = 50分钟。
动态规划
方程为:f[i]:=min(f[i],f[i-j]+m[j])
代码:
const
maxn=2500;
var
f:array[0..maxn]of longint;
a:array[0..maxn]of longint;
n,m:longint;
procedure init;
var i,j:longint;
begin
readln(n,m);
for i:=1 to n do
begin
readln(j);
a[i]:=j+a[i-1];
end;
for i:=1 to n do
a[i]:=a[i]+2*m;
f:=a;
end;
function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end;
procedure dp;
var i,j:longint;
begin
for i:=1 to n do
for j:=0 to n do
if i>j then
f[i]:=min(f[i],f[i-j]+a[j]);
write(f[n]-m);
end;
begin
assign(input,'river.in');reset(input);
assign(output,'river.out');rewrite(output);
init;
dp;
close(input);close(output);
end.