小w發明了乙個遊戲,他在黑板上寫出了一行數字a1,
a2,a
3,……
,an,
a1,a2,a3,……,an,
a1,a2,
a3,…
…,an
,然後給你m
mm個回合的機會,每會回你可以從中選擇乙個數字擦去它,接著剩下來的每個數字aiai
ai都要遞減乙個值bibi
bi。如此重複m
mm個回合,所有你擦去的數字之和就是你所得的分數。
小w和他的好朋友小y玩了這個遊戲,可是他發現,對於每個給出的a
aa和b
bb序列,小y的得分總比他高,所以他就很不服氣。於是他想讓你幫他算算,對於每個a
aa和b
bb序列,可以得到的最大得分是多少。
輸入檔案的第一行是乙個整數n
nn(1
11<=n
nn<=2000
2000
2000
),表示數字個數;第二行乙個整數m
mm(1
11<=m
mm<=n
nn),表示回合數,接下來一行有$n個不超過10000
10000
1000
0的正整數,a1,
a2,a
3,……
,a
na1,a2,a3,……,an
a1,a2,
a3,…
…,an
表示原始序列,最後一行有n個不超過500
50050
0的正整數,b1,
b2,b
3,……
,b
nb1,b2,b3,……,bn
b1,b2,
b3,…
…,bn
,表示每回合每個數字遞減的值。
輸出檔案只有乙個整數,表示最大的可能得分
sample input
3
310 20 30
4 5 6
sample output47
給n
nn個數字,然後取m
mm個數字,每取乙個數字,另外幾個數字要減去相應的數字,求怎樣取能取最大。
f [i
][j]
f[i][j]
f[i][j
]代表從前i
ii個裡面擦去j
jj個數字,所取得的最大數。
因為b [i
]b[i]
b[i]
到後面是累計的關係,所以我先對b[i
]b[i]
b[i]
(我這裡是a[i
].re
ma[i].rem
a[i].r
em)進行從大到小排序,然後進行dp,動態轉移方程:
f [i
][j]
=max
(f[i
−1][
j],f
[i−1
][j−
1]+a
[i]−
b[i]
∗(j−
1)
)f[i][j]=max(f[i-1][j],f[i-1][j-1]+a[i]-b[i]*(j-1))
f[i][j
]=ma
x(f[
i−1]
[j],
f[i−
1][j
−1]+
a[i]
−b[i
]∗(j
−1))
#include
#include
#include
#include
using
namespace std;
struct wh
a[2005];
int n,m,f[
2005][
2005];
bool
nwh(wh i,wh j)
//從大到小
intmain()
}printf
("%d"
,f[n]
[m])
;return0;
}
數字DP 數字遊戲
科協裡最近很流行數字遊戲。某人命名了一種不降數,這種數字必須滿足從左到右個位數字呈現小於等於的關係,如123,446.現在大家決定玩乙個遊戲,指定乙個整數閉區間 a,b 問這個區間內有多少個不降數。輸入多組測試資料。每組只包含兩個數字a和b 1 a,b 2 31 每行給出乙個測試資料的答案,即 a,...
數字DP 數字遊戲
科協裡最近很流行數字遊戲。某人命名了一種不降數,這種數字必須滿足從左到右各位數字呈非下降關係,如 123,446。現在大家決定玩乙個遊戲,指定乙個整數閉區間 a,b 問這個區間內有多少個不降數。輸入格式 輸入包含多組測試資料。每組資料佔一行,包含兩個整數 a 和 b。輸出格式 每行給出一組測試資料的...
數字遊戲 (dp)
problem description 丁丁最近沉迷於乙個數字遊戲。這個遊戲看似簡單,但丁丁在研究了很多天之後卻發覺原來在簡單的規則下想要贏得這個遊戲並不那麼容易。遊戲是這樣的,在你面前有一圈整數 一共n個 你要按順序將其分為m個部分,各部分內的數字相加,相加後得的m個結果對10取模後再相乘,最終得...