对于10%的数据,Si=1,1<=i<=n。
对于另外10%的数据,n=1.
这是一道基础的DP题。
先预处理take[i][j],表示从第i排中取出j个瓷器的最大价值,以及a[i][j]表示第i排前j个瓷器的总价值。
考虑对于每一排取出最左边的k个,那么剩下的j-k个就是最右边的,1<=k<=c。易得:Take[i][j]=max(a[i][k]+a[i][c]-a[i][c-j+k]),c表示第i排的瓷器数目。
接下来进行动态规划,F[i][j]表示从前i排取出j个的最大价值。
那么F[i][j]=max(F[i-1][j-k]+take[i][k])。
时间复杂度O(nmc)。大约是10^8,加上常数优化后在我的机器上可以在0.3s内出解
标准程序:
var g,a:array[0..100,0..10000] of longint;
ans:array[0..100,0..10000] of longint;
c:array[1..100] of longint;
n,m,i,j,k,m1:longint;
function max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end;
function min(x,y:longint):longint;
begin
if x<y then exit(x) else exit(y);
end;
begin
readln(n,m);
for i:=1 to n do
begin
read(c[i]);
for j:=1 to c[i] do
begin
read(a[i,j]);
//if j<>1 then
a[i,j]:=a[i,j]+a[i,j-1];
end;
end;
for i:=1 to n do
begin
for j:=1 to c[i] do
begin
for k:=0 to j do
begin
g[i,j]:=max(g[i,j],a[i,k]+a[i,c[i]]-a[i,c[i]-j+k]);
end;
end;
end;
for i:=1 to n do
begin
for j:=1 to m do
begin
for k:=0 to min(j,c[i]) do
begin
ans[i,j]:=max(ans[i,j],ans[i-1,j-k]+g[i,k]);
end;
end;
end;
writeln(ans[n,m]);
end.