参考了大佬的代码,倒着dp,正向的思路想不起来。
#include <bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
const int maxn=1e4+5;
struct Node{
int l,len;
bool operator<(const Node x)const{
return this->l>x.l;
}
}node[maxn];
int dp[maxn];
int main()
{
memset(dp,inf,sizeof(dp));
int n,k;
cin>>n>>k;
int i,j,len;
for(i=1;i<=k;i++)
scanf("%d%d",&node[i].l,&node[i].len);
sort(node+1,node+k+1);
for(i=1;i<=k;i++){//然后开始循环,dp里记录的是之后的时间段里所能够选择的最大的空暇时间
int l=node[i].l,len=node[i].len;
for(j=l+len;inf==dp[j]&&j<=n;j++);
if(inf==dp[j]) dp[l]=min(len,dp[l]);
else dp[l]=min(dp[j]+len,dp[l]);
}
int cnt=0;
for(i=1;i<=n&&inf==dp[i];i++);
printf("%d",n-dp[i]);
return 0;
}