一开始想的是,正着dp,越做发现越复杂,题意难以满足。后来看到大家都逆着做,的确简单了很多。代码思路借鉴了他人,是很好的解法。
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> t[10005];
int dp[100005];
int n,k;
int main()
{
scanf("%d%d",&n,&k);
int u,v;
for(int i=0;i<k;i++)
{
scanf("%d%d",&u,&v);
t[u].push_back(v);
}
for(int i=n;i>=1;i--){
if(t[i].empty()) dp[i]=dp[i+1]+1;
else {
for(int j=0;j<t[i].size();j++)
dp[i]=max(dp[i],dp[i+t[i][j]]);
}
}
printf("%d",dp[1]);
}