原题:zjnu 1293
题意:
给出总时间t和任务数k
每个任务有一个开始时间和持续时间,每个尼克手头没任务的时刻,都要从这个时刻开始的几个任务中选择一个开始任务,求最大的空闲时间
解析:
从后往前dp,dp[i]表示从i到最后最大的空闲时间,假设i时刻没有任务,dp[i]=dp[i+1]+1,如果有,dp[i]=max(dp[i]+time[k]),即枚举每个任务结束后那个时刻的空闲时间,取最大值
代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string>
#include<string.h>
#include<map>
#include<vector>
#include<queue>
#include<bitset>
using namespace std;
int dp[10009];
vector<int>v[10009];
int main(){
int t,k;cin>>t>>k;
while(k--){
int a,b;scanf("%d%d",&a,&b);
v[a].push_back(b);
}
for(int i=t;i>=1;i--){
if(v[i].empty()){dp[i]=dp[i+1]+1;continue;}
for(int j=0;j<v[i].size();j++){
dp[i]=max(dp[i],dp[i+v[i][j]]);
}
}
printf("%d\n",dp[1]);
}