洛谷 P1280 尼克的任务(DP)

题目链接:https://www.luogu.com.cn/problem/P1280

设f[i]表示从i到n分钟尼克能获得的最大空闲时间。

倒序枚举,

如果第i个时刻开始有工作可以做,那么f[i]=max(f[i],f[i+v[i][j]]),其中v[i][j]表示第i时刻开始的第j项工作的耗时。

如果第i个时刻开始没有工作,那么f[i]=f[i+1]+1。

 

AC代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<vector>
 4 using namespace std;
 5 const int N=10005;
 6 int n,k,f[N];
 7 vector<int> v[N];
 8 int main(){
 9     scanf("%d%d",&n,&k);
10     for(int i=1;i<=k;i++){
11         int p,t;
12         scanf("%d%d",&p,&t);
13         v[p].push_back(t);
14     }
15     for(int i=n;i>=1;i--){
16         if(v[i].size()>0){
17             for(int j=0;j<v[i].size();j++) f[i]=max(f[i],f[i+v[i][j]]);
18         }
19         else f[i]=f[i+1]+1;
20     }
21     printf("%d",f[1]);
22     return 0;
23 }
AC代码

 

posted @ 2020-11-03 20:51  dfydn  阅读(58)  评论(0编辑  收藏  举报