思路是处理最开始和最后的任务,dp状态转移
#include<bits/stdc++.h>
using namespace std;
const int maxn=10005;
int n,k,dp[10005],ans=0,rm=1e9;
bool used[10005];
bool vis[10005];
struct node{
int l,r;
}rw[maxn];
bool cmp(node a,node b){
if(a.l==b.l) return a.r<b.r;
return a.l<b.l;
}
int main(){
cin>>n>>k;
for(int i=1;i<=k;i++){
scanf("%d%d",&rw[i].l,&rw[i].r);
rw[i].r+=rw[i].l-1;
rm=min(rm,rw[i].r);
}
sort(rw+1,rw+k+1,cmp);
for(int i=1;i<=k;i++){
if(rw[i].l<=rm){//开始任务
dp[i]=rw[i].l-1;
used[i]=1;
if(rw[i+1].l!=rw[i].l) rm=-1e9;
}
if(used[i]==0) dp[i]=-1e9;//不会做的任务
for(int j=i+1;j<=k;j++){
if(rw[j].l<=rw[i].r) continue;
vis[i]=1;
if(dp[i]+rw[j].l-rw[i].r-1>dp[j]){
used[j]=1;
dp[j]=dp[i]+rw[j].l-rw[i].r-1;
}
//cout<<i<<' '<<j<<' '<<endl;
if(rw[j+1].l!=rw[j].l) break;
}
if(vis[i]==0) dp[i]+=n-rw[i].r;//结束任务
ans=max(ans,dp[i]);
}
//for(int i=1;i<=k;i++) cout<<used[i]<<' '<<vis[i]<<endl;
cout<<ans;
}
第六个点错了,输出0。