[SDOI2004]打鼹鼠
......
心血来潮,手打abs
结果...BZOJ上CE,洛谷上WA...
把宏定义换成函数就过了
显然一个点可以走到另一个点,当且仅当两点鼹鼠出现时间$\leq$两点间距离的曼哈顿距离
显然是DP
f[i]=max{f[j]}+1(i,j满足条件t[i]-t[j]>=abs(x[i]-x[j])+abs(y[i]-y[j]))
1 #include<cstdio> 2 #include<queue> 3 #include<iostream> 4 #include<cstring> 5 #define int long long 6 inline int abs(int x){if(x<0) return -x;return x;} 7 using namespace std; 8 inline int read(){ 9 int ans=0,f=1;char chr=getchar(); 10 while(!isdigit(chr)){if(chr=='-') f=-1;chr=getchar();} 11 while(isdigit(chr)){ans=(ans<<3)+(ans<<1)+chr-48;chr=getchar();} 12 return ans*f; 13 }int n,m,x[10005],y[10005],z[10005],f[10005],ans; 14 signed main(){ 15 n=read(),m=read(); 16 for(int i=1;i<=m;i++) z[i]=read(),x[i]=read(),y[i]=read(),f[i]=1; 17 for(int i=1;i<=m;i++){ 18 for(int j=1;j<i;j++) 19 if(z[i]-z[j]>=abs(x[i]-x[j])+abs(y[i]-y[j])) 20 f[i]=max(f[j]+1,f[i]); 21 ans=max(ans,f[i]); 22 }cout<<ans; 23 return 0; 24 }