f[i]
对于某个区间起点,状态转移到终点,要反过来枚举 i
方程不难想,两种情况
f[i] =max{ f[i+len[j] ] }
f[i]= f[i+1]+1
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std ;
const int N=1e4+3;
int n,m,b[N],f[N];
struct T{
int x,l;
bool operator<(T a)const{
return x>a.x;
}
}a[N];
int solve(){
int i,j;
int x=1;
for(i=n;i>=1;i--)
if(b[i]){
for(j=1;j<=b[i];j++)
f[i]=max(f[i],f[i+a[x].l]),x++;
}
else f[i]=f[i+1]+1;
}
signed main(){
int i;
cin>>n>>m;
for(i=1;i<=m;i++)
cin>>a[i].x>>a[i].l,b[a[i].x]++;
sort(a+1,a+1+m);
solve();
cout<<f[1];
}