動態規劃 sicily1221

2021-08-26 06:01:57 字數 1380 閱讀 6692

解題思路:

題目有個地方,我理解錯了,導致wa很多次,問題是當你擦除a[i]時,你要將它對應的b[i]去減剩餘的序列,之前一直以為第i輪就減去b[i],orz。

簡單的動態,dp[i]表示去到第i輪時的最大擦出和。

按照我們直觀的思路,肯定是最大消費的(也就是b[i]比較大的)應該先拿掉,因此我們先按照cost排序。

dp[j] = min;

原始碼如下:

/*

* main.cpp

* * created on: sep 23, 2011

* author: raphealguo

*/#include #include #include #include using namespace std;

#define maxl 210

struct node;

bool cmp(node a, node b)

int main()

for (i = 0; i < n; ++i)

sort(nodes, nodes+n, cmp);

for (i = 0; i < n; ++i)}}

printf("%d\n", dp[m]);

}}

附帶原題:

小 w發明了乙個遊戲,他在黑板上寫出了一行數字 a1,a2,….an

,然後給你 m

個回合的機會,每回合你可以從中選擇乙個數擦去它,接著剩下來的每個數字 ai

都要遞減乙個值 bi

。如此重複 m

個回合,所有你擦去的數字之和就是你所得到的分數。

小 w 和他的好朋友小 y

玩了這個遊戲,可是他發現,對於每個給出的 an

和 bn

序列,小 y

的得分總是比他高,所以他就很不服氣。於是他想讓你幫他算算,對於每個 an

和 bn

序列,可以得到的最大得分是多少。這樣他就知道有沒有可能超過小 y

的得分。

第一行,乙個整數 n

( 1<=n<=200

),表示數字的個數。

第二行,乙個整數 m

( 1<=m<=n

),表示回合數。

接下來一行有 n

個不超過 10000

的正整數, a1,a2…an

,表示原始數字

最後一行有 n

個不超過 500

的正整數, b1,b2….bn

,表示每回合每個數字遞減的值

乙個整數,表示最大可能的得分

3 

310 20 30

4 5 6

47
zsuacm team member

Sicily 1221 數字遊戲

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

Sicily 1221 數字遊戲

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

Sicily1221 數字遊戲 week 10

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