1. 程式人生 > >luogu P1280 尼克的任務 序列DP

luogu P1280 尼克的任務 序列DP

sin back max nbsp pri push_back can int spa

我們發現,我們從前往後DP有苦難,因為現在的選擇存在後效性。

如果我們從後向前DP,f[i]表示從i時刻到下班的最小工作時間,從後向前轉移,則不存在後效性問題。

 1 #include <cstdio>
 2 #include <vector>
 3 using namespace std;
 4 vector <int> vec[10010];
 5 int f[10010];
 6 int n,k;
 7 int main()
 8 {
 9     scanf("%d%d",&n,&k);
10     int tx,ty;
11 for (int i = 1;i <= k;i++) 12 { 13 scanf("%d%d",&tx,&ty); 14 vec[tx].push_back(ty); 15 } 16 for (int i = n;i >= 1;i--) 17 { 18 if (!vec[i].size()) f[i] = f[i + 1] + 1; 19 for (int o = 0;o < vec[i].size();o++) 20 f[i] = max(f[i],f[i + vec[i][o]]);
21 } 22 printf("%d\n",f[1]); 23 return 0; 24 }

luogu P1280 尼克的任務 序列DP