题目大意:
有一个$n imes n$的格子,按顺序出现$m(mleq10000)$只鼹鼠。一开始你可以任选一个位置作为一个起点,每秒钟你可以选择原地不动或走到任一与当前位置四连通的格子上。第$t_i$秒会在$(x_i,y_i)$上出现一个鼹鼠,若你当时刚好在这个格子上,就算作成功打到了这个鼹鼠。问最多能打到几个鼹鼠?
思路:
用$f[i]$表示前$i$个鼹鼠中最多能打到几个。转移时判断一下曼哈顿距离是否小于等于时间差即可。
1 #include<cstdio> 2 #include<cctype> 3 #include<algorithm> 4 inline int getint() { 5 register char ch; 6 while(!isdigit(ch=getchar())); 7 register int x=ch^'0'; 8 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 9 return x; 10 } 11 const int M=10000; 12 int t[M],x[M],y[M],f[M]; 13 int main() { 14 const int n=getint(),m=getint(); 15 int ans=0; 16 for(register int i=0;i<m;i++) { 17 t[i]=getint(),x[i]=getint(),y[i]=getint(),f[i]=1; 18 for(register int j=0;j<i;j++) { 19 if(std::abs(x[i]-x[j])+std::abs(y[i]-y[j])<=t[i]-t[j]) { 20 f[i]=std::max(f[i],f[j]+1); 21 } 22 } 23 ans=std::max(ans,f[i]); 24 } 25 printf("%d ",ans); 26 return 0; 27 }