m的数据范围是10000,这么模棱两可。。纠结是要m^2还是有别的优化
初步想到的动归是由f[t][x][y]=max(f[t-1][x±1][y±1]+ds) (ds就是有木有地鼠可以打到。)
但是看了看题目觉得好像x,y的二维是开不出来的,于是想其他和x,y大小无关的方法。
于是想出了第二种DP:
f[i]表示打到第i个地鼠,最多能打掉多少个
f[i]=max(f[i],f[j]+1) j∈[1,i-1]
这里j的实际意义是在假设上一只打掉的地鼠是第j只
O(m^2/2)卡过去+滚动省空间again!
---------------------------------------------------------------------------------------
Code:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define For(i,l,r) for(int (i)=(l);(i)<=(r);(i)++)
using namespace std;
const int M=10010;
struct node{
int x,y,t;
}D[M];
int n,m,f[M];
bool ok(int a,int b){
return abs(D[a].x-D[b].x)+abs(D[a].y-D[b].y)<=D[b].t-D[a].t;
}
int main(){
freopen("1207.in","r",stdin);
freopen("1207.out","w",stdout);
int ans=0;
scanf("%d%d",&n,&m);
For(i,1,m){
f[i]=1;
scanf("%d%d%d",&D[i].t,&D[i].x,&D[i].y);
For(j,1,i-1) if(ok(j,i)) f[i]=max(f[i],f[j]+1);
ans=max(ans,f[i]);
}printf("%d\n",ans);
return 0;
}