kc來到了乙個盛產瓷器的國度。他來到了一位商人的店鋪。在這個店鋪中,kc看到了乙個有n(1<=n<=100)排的櫃子,每排都有一些瓷器,每排不超過100個。那些精美的藝術品使kc一下心動了,決定從n排的商品中買下m(1<=m<=10000)個瓷器。
這個商人看kc的臉上長滿了痘子,就像苔蘚一樣,跟精美的瓷器相比相差太多,認為這麼精緻的藝術品被這樣的人買走藝術價值會大打折扣。商人感到不爽,於是規定每次取商品只能取其中一排的最左邊或者最右邊那個,想為難kc。
現在kc又獲知每個瓷器的價值(用乙個不超過100的正整數表示),他希望取出的m個商品的總價值最大。
input
輸入檔案的第一行包括兩個正整數n,m;
接下來2到n+1行,第i行第乙個數表示第i排櫃子的商品數量si,接下來si個數表示從左到右每個商品的價值。
output
輸出檔案只有乙個正整數,即m個商品最大的總價值。
sample input
輸入1:2 33 3 7 2
3 4 1 5
輸入2:
1 34 4 3 1 2
sample output
輸出1:15樣例解釋1:
取第一排的最左邊兩個和第二排的最右邊那個。總價直為3+7+5=15;
輸出2:
9
data constraint
對於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 xreadln(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.
模擬 NOIP 2013 花匠
花匠棟棟種了一排花,每株花都有自己的高度。花兒越長越大,也越來越擠。棟棟決定把這排中的一部分花移走,將剩下的留在原地,使得剩下的花能有空間長大,同時,棟棟希望剩下的花排列得比較別緻。具體而言,棟棟的花的高度可以看成一列整數h 1,h 2,h n。設當一部分花被移走後,剩下的花的高度依次為g 1,g ...
NOI(P)2013模擬 秘密任務
這題是在最短路上研究問題的,所以理所當然要建個圖先。其次我們先考慮費用,看看這圖,再yy一下,那麼我們可以發現這就是典型的最小割問題,可是我們還是要考慮如何判斷這個割是否唯一。首先,大家可以先去看我的另乙個blog,上面有寫類似這樣的判斷最大流是否唯一。其實這兩題是不同的。所以我在考試時就掛了。因為...
NOIP2013模擬 粉刷匠
給出n個球,其中有c1個球是顏色1的,有c2個球是顏色2的,有c3個球是顏色3的 有ck個球是顏色k的。求相鄰兩個球顏色不同的排列方案。k 15,ci 6,資料組數 2000 這種題一般很難有直接的通式,可以考慮dp。設fi,j表示,前i中顏色已經放完了,其中產生了j個不合法的空的方案數。這裡的空指...