Enlace al tema: P1280 La misión de Nick
No, es halagador, y luego fue pisoteado.
Considere empujar desde atrás hacia adelante. Si no hay tarea para comenzar aquí, puede tomar un descanso y, de ser así, actualizar el valor en esta ubicación.
Sea \ (dp [i] \) el tiempo máximo de inactividad desde \ (i \) hasta \ (n \) .
Entonces:
Si no hay una tarea inicial aquí:
\ [dp [i] = dp [i + 1] +1 \]
Hay tareas para comenzar:
\ [dp [i] = dp [i + r_i] \]
Por supuesto, "fin" aquí significa terminar en el último minuto de este minuto, lo que puede entenderse como que termina al comienzo del siguiente minuto sin ocupar este minuto.
La complejidad del tiempo es \ (\ mathcal O (n + k) \) , puede pasar esta pregunta.
\ (Código \) :
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define MAXN 10005
#define read(x) scanf("%d",&x)
#define ll long long
int n,k;
struct node{int l,r;}a[MAXN];
int b[MAXN]={0},ans=0,dp[MAXN]={0};
bool cmp(node x,node y){return x.l>y.l;}
int main()
{
read(n),read(k);
for(int i=1;i<=k;i++) read(a[i].l),read(a[i].r),b[a[i].l]++;
sort(a+1,a+k+1,cmp);
int k=1;
for(int i=n;i>=1;i--)
{
if(!b[i]) dp[i]=dp[i+1]+1;
else for(int j=1;j<=b[i];j++) dp[i]=max(dp[i],dp[i+a[k].r]),k++;
}
printf("%d\n",dp[1]);
return 0;
}