DP ssl 1653數字遊戲

2021-09-05 17:54:14 字數 1561 閱讀 6886

小w發明了乙個遊戲,他在黑板上寫出了一行數字a1,a2,a3,……,an,然後給你m個回合的機會,每會回你可以從中選擇乙個數字擦去它,接著剩下來的每個數字ai都要遞減乙個值bi。如此重複m個回合,所有你擦去的數字之和就是你所得的分數。

小w和他的好朋友小y玩了這個遊戲,可是他發現,對於每個給出的a和b序列,小y的得分總比他高,所以他就很不服氣。於是他想讓你幫他算算,對於每個a和b序列,可以得到的最大得分是多少。

輸入檔案的第一行是乙個整數n(1<=n<=2000),表示數字個數;第二行乙個整數m(1<=m<=n),表示回合數,接下來一行有n個不超過10000的正整數,a1,a2,a3,……,an表示原始序列,最後一行有n個不超過500的正整數,b1,b2,b3,……,bn,表示每回合每個數字遞減的值。

輸出檔案只有乙個整數,表示最大的可能得分

3

310 20 30

4 5 6

47
假如a[i

]在a[

j]

a[i]在a[j]

a[i]在a

[j]前刪除,而b[i

]小於b

[j

]b[i]小於b[j]

b[i]小於

b[j]

的話,那麼我們可以交換這兩個數的刪除順序而使得總和更大。

所以,第一步就是對數按b[i

]b[i]

b[i]

從大到小排序。排序後,刪除的順序就是從左到右的。

設f [i

,j

]f[i,j]

f[i,j]

表示從前i個刪除j個數的最大分值。

動態轉移方程:

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

using

namespace std;

int n,m,a[

2005

],b[

2005

],f[

2005][

2005];

intmain()

//排序,原因↑↑↑

for(

int i=

1;i<=n;i++

)//動態轉移方程↑↑↑

printf

("%d"

,f[n]

[m])

;}

SSL 1653 數字遊戲

description 小w發明了乙個遊戲,他在黑板上寫出了一行數字a1,a2,a3,an,然後給你m個回合的機會,每會回你可以從中選擇乙個數字擦去它,接著剩下來的每個數字ai都要遞減乙個值bi。如此重複m個回合,所有你擦去的數字之和就是你所得的分數。小w和他的好朋友小y玩了這個遊戲,可是他發現,對...

數字DP 數字遊戲

科協裡最近很流行數字遊戲。某人命名了一種不降數,這種數字必須滿足從左到右個位數字呈現小於等於的關係,如123,446.現在大家決定玩乙個遊戲,指定乙個整數閉區間 a,b 問這個區間內有多少個不降數。輸入多組測試資料。每組只包含兩個數字a和b 1 a,b 2 31 每行給出乙個測試資料的答案,即 a,...

數字DP 數字遊戲

科協裡最近很流行數字遊戲。某人命名了一種不降數,這種數字必須滿足從左到右各位數字呈非下降關係,如 123,446。現在大家決定玩乙個遊戲,指定乙個整數閉區間 a,b 問這個區間內有多少個不降數。輸入格式 輸入包含多組測試資料。每組資料佔一行,包含兩個整數 a 和 b。輸出格式 每行給出一組測試資料的...