洛谷1280(dp)
阿新 • • 發佈:2019-03-06
() 解決 等於 兩個 否則 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) { 5int 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)