題目描述:小明每天都在開源社群上做專案,假設每天他都有很多專案可以選,其中每個專案都有乙個開始時間和截止時間,假設做完每個專案後,拿到報酬都是不同的。由於小明馬上就要碩士畢業了,面臨著買房、買車、給女友買各種包包的鴨梨,但是他的錢包卻空空如也,他需要足夠的money來充實錢包。萬能的網友麻煩你來幫幫小明,如何在最短時間內安排自己手中的專案才能保證賺錢最多(注意:做專案的時候,專案不能並行,即兩個專案之間不能有時間重疊,但是乙個專案剛結束,就可以立即做另乙個專案,即專案起止時間點可以重疊)。
輸入:輸入可能包含多個測試樣例。
對於每個測試案例,輸入的第一行是乙個整數n(1<=n<=10000):代表小明手中的專案個數。
接下來共有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
思路:總共有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 如果開始做某個作業,就必須把這個作業做完了,才能做下乙個作業。有多組測試資料。第一行乙個整數表示測試資料的組數 ...