中文就不说题意了。
题解:最长不下降子序列的变种,dp[i]表示最后一个打i时的最大打击个数。
#include <iostream> #include<cstdio> using namespace std; struct node{ int time,x,y; }a[100010]; int max1(int x,int y){ return x>y?x:y; } int z(int x){ return x>=0? x:-x; } int check(int x,int y){ if(z(a[x].x-a[y].x)+z(a[x].y-a[y].y)<=z(a[x].time-a[y].time))return 1; return 0; } int dp[100010]; int main() { int n,m,i,j; scanf("%d%d",&n,&m); for(i=1;i<=m;i++){ scanf("%d%d%d",&a[i].time,&a[i].x,&a[i].y); } for(i=1;i<=m;i++)dp[i]=1; for(i=2;i<=m;i++){ for(j=1;j<i;j++){ if(z(a[i].x-a[j].x)+z(a[i].y-a[j].y)<=z(a[i].time-a[j].time))dp[i]=max1(dp[i],dp[j]+1); } } int ans=0; for(i=1;i<=m;i++)ans=max1(ans,dp[i]); printf("%d\n",ans); return 0; }