把区间上的问题转化为点上的问题,即把时间段上的问题转化为时间点上的问题
f[i]表示i到n时刻的最大空闲时间
状态方程f[i]
=f[i+1]+1(第i个时刻没有任务时)
=max(f[i],f[i+a[j].l])(有任务时,a[j].l表示i时刻这一任务持续的时间)
#include<iostream> #include<algorithm> using namespace std; struct pp { int s;//start时刻 int l;//last时间 }a[10005]; int n,k,dp[10005]; int book[10005];//标记这个时刻是否有任务 bool cmp(pp a,pp b) { return a.s>b.s; } void solve() { int i,j; cin>>n>>k; for(i=1;i<=k;i++) { cin>>a[i].s>>a[i].l; a[i].s--; book[a[i].s]++;//这一时刻有几个任务 } sort(a+1,a+k+1,cmp);//从大到小排序 j=1; for(i=n-1;i>=0;i--) { if(book[i]==0)//这一时刻无任务 dp[i]=dp[i+1]+1; else { for(int m=1;m<=book[i];m++)//i这一时刻有多少个任务 { dp[i]=max(dp[i],dp[i+a[j].l]); j++; } } } cout<<dp[0]<<endl; } int main() { solve(); }