P1280 尼克的任務
阿新 • • 發佈:2022-03-30
由於題目要求在空暇時間有任務開始時必須完成該任務,那麼可以認為開始時間是受限的,如果以結束時間作為狀態可能會導致前端不符合題意(可接任務而不接)。因此必須以開始時間作為狀態。狀態的轉移由後端得來,而正序遍歷時後端的資料還未進行轉移,是未知的,所以需要倒序遍歷,那麼就可以設 dp[ i ] 為從 i 到 n 的最大空暇時間。如果 i 點空暇得到轉移 dp[ i ] = dp[ i+1 ]+1 ,如果 i 點是起點,那麼就從終點進行轉移,dp[ i ] = max( dp[ i ], dp[ i + t[ j ] ] )。
#include<iostream> #include<algorithm> using namespace std; struct Node { int s, t; bool operator < (const Node& A)const { if (s != A.s) return s < A.s; else return t < A.t; } }arr[10007]; int dp[10007], n, k, ans; int main(void) { cin >> n >> k; for (int i = 1; i <= k; i++) cin>> arr[i].s >> arr[i].t; sort(arr + 1, arr + k + 1); for (int i = n; i >= 1; i--) { int pos = k; bool flag = false; while (arr[pos].s != i && pos > 0)pos--; while (arr[pos].s == i) { dp[i] = max(dp[i], dp[i + arr[pos].t]);--pos; flag = true; } if (!flag) dp[i] = dp[i + 1] + 1; } cout << dp[1] << endl; return 0; }