水dp,直接m^2搞就好了,然后跟着黄学长学了个优化,mx[i]表示从1-i的最大值。
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<algorithm>
#define maxn 10010
using namespace std;
struct yts
{
int t,x,y;
}a[maxn];
int f[maxn],mx[maxn];
int n,ans,m;
bool cmp(yts x,yts y)
{
return x.t<y.t;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++) scanf("%d%d%d",&a[i].t,&a[i].x,&a[i].y);
f[1]=1;mx[1]=1;
for (int i=2;i<=m;i++)
{
f[i]=1;
for (int j=i-1;j>=1;j--)
{
if (mx[j]+1<=f[i]) break;
if (f[j]+1>f[i] && a[i].t-a[j].t>=abs(a[i].x-a[j].x)+abs(a[i].y-a[j].y)) f[i]=f[j]+1;
}
mx[i]=max(mx[i-1],f[i]);
}
printf("%d\n",mx[m]);
return 0;
}