1. 程式人生 > >洛谷1280(dp)

洛谷1280(dp)

() 解決 等於 兩個 否則 while 此刻 style ack

題目性質:1.當前節點空閑則必須做任務,而不是可選可不選;2.然而前面的如果能覆蓋當前節點,就可以不選。

解決方法:倒著掃可以很好地解決這兩個問題。dp[i]為時刻i可得的最大空閑時間。如果此刻沒有任務,則空閑時間+1;否則最大空閑時間等於任務結束節點的最大空閑時間:

 1     vector<int> dp(n + 2, 0);
 2     int cnt = k - 1;
 3     irep(i, n, 1) {
 4         if (cnt < 0 || a[cnt].first != i) {
 5             dp[i] = dp[i + 1
] + 1; 6 } else { 7 while (~cnt && a[cnt].first == i) { 8 dp[i] = max(dp[a[cnt--].second], dp[i]); 9 } 10 } 11 }

總代碼main:

 1 int main() {
 2     read(n), read(k);
 3     vector<P> a;
 4     rep(i, 1, k) {
 5
int x, y; 6 read(x), read(y); 7 a.push_back(P(x, x + y)); 8 } 9 sort(a.begin(), a.end()); 10 vector<int> dp(n + 2, 0); 11 int cnt = k - 1; 12 irep(i, n, 1) { 13 if (cnt < 0 || a[cnt].first != i) { 14 dp[i] = dp[i + 1
] + 1; 15 } else { 16 while (~cnt && a[cnt].first == i) { 17 dp[i] = max(dp[a[cnt--].second], dp[i]); 18 } 19 } 20 } 21 writeln(dp[1]); 22 return 0; 23 }

洛谷1280(dp)