bzoj1207[HNOI2004]打鼹鼠
题意:
在一个n*n的网格 中,如果i时刻鼹鼠在某个网格中出现,而机器人也处于同一网格的话,那么这 个鼹鼠就会被机器人打死。而机器人每一时刻只能够移动一格或停留在原地不动。机器人的移动是指从当前所处的网格移向相邻的网格,且不能走出整个n*n的网格。游戏开始时,你可以自由选定机器人的初始位置。已知一段时间内,鼹鼠出现的时间和地点,求机器人在这一段时间内最多打死多少鼹鼠。
题解:
一道类似求最长公共子串的题,枚举打一只地鼠前是打完哪只地鼠后到达的,因为数据弱使用不用加奇怪优化。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define inc(i,j,k) for(int i=j;i<=k;i++) 5 using namespace std; 6 int f[20000],t[20000],x[20000],y[20000]; 7 int main(){ 8 int n,m; scanf("%d%d",&n,&m); int ans=0; 9 inc(i,1,m){ 10 scanf("%d%d%d",&t[i],&x[i],&y[i]); int mx=0; 11 inc(j,1,i-1)if(t[i]-t[j]>=abs(x[i]-x[j])+abs(y[i]-y[j]))mx=max(mx,f[j]); 12 f[i]=mx+1; ans=max(ans,f[i]); 13 } 14 printf("%d",ans); 15 return 0; 16 }
20160324