題目資訊:
時間限制:
3000 ms | 記憶體限制:
65535 kb
難度: 4
描述 小明每天都在開源社群上做專案,假設每天他都有很多專案可以選,其中每個專案都有乙個開始時間和截止時間,假設做完每個專案後,拿到報酬都是不同的。由於小明馬上就要碩士畢業了,面臨著買房、買車、給女友買各種包包的鴨梨,但是他的錢包卻空空如也,他需要足夠的money來充實錢包。萬能的網友麻煩你來幫幫小明,如何在最短時間內安排自己手中的專案才能保證賺錢最多(注意:做專案的時候,專案不能並行,即兩個專案之間不能有時間重疊,但是乙個專案剛結束,就可以立即做另乙個專案,即專案起止時間點可以重疊)。
輸入
輸入可能包含多個測試樣例。
對於每個測試案例,輸入的第一行是乙個整數n(1<=n<=5000):代表小明手中的專案個數。
接下來共有n行,每行有3個整數st、ed、val,分別表示專案的開始、截至時間和專案的報酬,相鄰兩數之間用空格隔開。
st、ed、value取值均在32位有符號整數(int)的範圍內,輸入資料保證所有資料的value總和也在int範圍內。
輸出對應每個測試案例,輸出小明可以獲得的最大報酬。
樣例輸入
31 3 6
4 8 9
2 5 16
41 14 10
5 20 15
15 20 8
18 22 12
樣例輸出
1622
提示上傳時資料加強,專案起始時間和終止時間可能相同(其他oj可能無此情況)
解題思路:
乍一看這題有點貪心演算法的味道,其實不是。這仍然是一道動態規劃的揹包問題,而狀態轉移方程需要去找到結束時間在當前專案開始時間之前的專案,那時的最大報酬加上當前專案的報酬和上乙個專案的報酬相比較取最大值。完成這樣的操作則必須需要排序,因為這裡需要去找到結束時間在當前專案開始時間之前的專案,所以需要按專案結束時間從小到大排序,相同則按專案開始時間從小到大排序。
**部分:
#include #include #include int dp[5005];
struct project
item[5005];
int find(int k)
return tail-1;
}int cmp(const void *a,const void *b)
int main()
return 0;
}
NYOJ 720 專案安排(DP)
click here 題意 給出 n 個區間 a,b 每個區間有個權值 wi,如何取不相交的區間,使權值最大。解題思路 估計是一道很經典的題目,目前學習了三種解法。1 如果區間範圍比較小,例如 zoj 3637。則可以用 dp i 表示考慮到數軸中 i 點時的最大值。存區間的時候,不再存入結構體,而...
nyoj720 專案安排 二分 dp
思路 dp i 表示前i個專案的最大收益,轉移方程很好寫dp i max,val i 表示第i個專案的價值,dp k 表示前k個的最佳收益,k滿足ed k st i 並且是最接近st i 的那個專案,即i需要找到乙個可以相容的專案,因此需要對所有專案按照結束時間公升序排序。但是不容忽略的是當結束時間...
題目1499 專案安排
題目描述 小明每天都在開源社群上做專案,假設每天他都有很多專案可以選,其中每個專案都有乙個開始時間和截止時間,假設做完每個專案後,拿到報酬都是不同的。由於小明馬上就要碩士畢業了,面臨著買房 買車 給女友買各種包包的鴨梨,但是他的錢包卻空空如也,他需要足夠的money來充實錢包。萬能的麻煩你來幫幫小明...