f[i]表示i-1以前的空暇时间最大
f[i+t]=max(f[i+t],f[i])(一个是做这个任务,一个是不做)
先从第一个时间开始做,然后看做哪一个的空暇短
需要付最小值,因为你不能从后面的时间开始,必须前面推到过才行
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int ans,m,n,f[10509];
vector <int>a[10999];
int main(){
memset(f,128,sizeof f);
scanf("%d%d",&m,&n);
for(int i=1,x,y;i<=n;i++)
{
scanf("%d%d",&x,&y);
a[x].push_back(y);
}
f[1]=0;
for(int i=1;i<=m;i++)
{
if(a[i].size())
for(int j=0;j<a[i].size();j++){
f[i+a[i][j]]=max(f[i+a[i][j]],f[i]);
}
else f[i+1]=max(f[i]+1,f[i+1]);
}
printf("%d",f[m+1]);
}