来源:BZOJ1207
dp,和最长上升子序列其实是一个意思的,只不过我们寻找我们下一步要打的时候是不一样的,其余的情况其实还是比较简单的
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m;
const int MAXN = 10010;
struct Mouse{
int x,y,time;
void input(){
scanf("%d%d%d",&time,&x,&y);
}
void get(int times,int xx,int yy){
time = times;
x = xx;
y = yy;
}
}p[MAXN];
inline bool check(int x,int y){
if(x<1 || x>n || y<1 || y>n) return false;
else return true;
}
int dp[MAXN];
inline bool judge(int mid,int des){
return abs(p[mid].x-p[des].x)+abs(p[mid].y-p[des].y) <= p[des].time-p[mid].time;
}
int DP(){
int ans = 1;
for(int i=1;i<=m;i++) dp[i] = 1;
for(int i=1;i<=m;i++){
for(int j=1;j<=i-1;j++)
{
if(judge(j,i)) dp[i] = max(dp[i],dp[j]+1);
}
ans = max(ans,dp[i]);
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) {
p[i].input();
}
printf("%d\n",DP());
return 0;
}