動態規劃 專案安排

2021-06-22 01:12:27 字數 1415 閱讀 4364

題目描述:小明每天都在開源社群上做專案,假設每天他都有很多專案可以選,其中每個專案都有乙個開始時間和截止時間,假設做完每個專案後,拿到報酬都是不同的。由於小明馬上就要碩士畢業了,面臨著買房、買車、給女友買各種包包的鴨梨,但是他的錢包卻空空如也,他需要足夠的money來充實錢包。萬能的網友麻煩你來幫幫小明,如何在最短時間內安排自己手中的專案才能保證賺錢最多(注意:做專案的時候,專案不能並行,即兩個專案之間不能有時間重疊,但是乙個專案剛結束,就可以立即做另乙個專案,即專案起止時間點可以重疊)。

輸入:輸入可能包含多個測試樣例。

對於每個測試案例,輸入的第一行是乙個整數n(1<=n<=10000):代表小明手中的專案個數。

接下來共有n行,每行有3個整數st、ed、val,分別表示專案的開始、截至時間和專案的報酬,相鄰兩數之間用空格隔開。

st、ed、value取值均在32位有符號整數(int)的範圍內,輸入資料保證所有資料的value總和也在int範圍內。

輸出:對應每個測試案例,輸出小明可以獲得的最大報酬。

樣例輸入:

3

1 3 6

4 8 9

2 5 16

41 14 10

5 20 15

15 20 8

18 22 12

樣例輸出:

16

22

思路:總共有n個專案,用倒推的思想,假設已經知道第n-1個專案中的最優解dp[n-1],如果要得到n個專案中的最優解dp[n],就需要比較新增了第n個專案之後是否會提高收益,而新增了第n個專案之後的解是,value[n] + dp[i],其中i是指新增了第n個專案之後,前i個專案可以不受影響的進行。

到了這一步,就可以知道需要對專案按照結束時間進行排序了,對吧?

#include #include using namespace std;

int n;

class p;

p p[10001];

int dp[10001]; //dp[i]安排前i個專案,多能到得到的最大value

bool cmp(const p & p1, const p & p2)

int main()

sort(p+1, p+n+1, cmp);

dp[0] = 0;

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

dp[i] = dp[j] + p[i].value;

if(dp[i] < dp[i-1])

dp[i] = dp[i-1];

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

}return 0;

}

繼續動態規劃 安排問題

九度1499 專案安排 九度1463 招聘會 都是時間安排問題,dp陣列下標可以表示時間也可以表示專案數,具體方法可以學習部落格總結的很好。我自己在做的時候,忘記了先按結束時間排序,如果不按照結束時間先後來安排,如先安排結束晚的,再安排結束早的,那麼先開始早的再開始晚的這種情況就不會被考慮到。另外,...

九度OJ 1499 專案安排 動態規劃

題目描述 小明每天都在開源社群上做專案,假設每天他都有很多專案可以選,其中每個專案都有乙個開始時間和截止時間,假設做完每個專案後,拿到報酬都是不同的。由於小明馬上就要碩士畢業了,面臨著買房 買車 給女友買各種包包的鴨梨,但是他的錢包卻空空如也,他需要足夠的money來充實錢包。萬能的麻煩你來幫幫小明...

任務安排 動態規劃dp 狀態壓縮

馬上假期就要結束了,zjm還有 n 個作業,完成某個作業需要一定的時間,而且每個作業有乙個截止時間,若超過截止時間,一天就要扣一分。zjm想知道如何安排做作業,使得扣的分數最少。tips 如果開始做某個作業,就必須把這個作業做完了,才能做下乙個作業。有多組測試資料。第一行乙個整數表示測試資料的組數 ...