BZOJ1207: [HNOI2004]打鼹鼠
【传送门:BZOJ1207】
简要题意:
有一个n*n的矩阵,给出m个点,每个点都在固定的位置,固定的时刻出现,点按照出现的时刻递增给出,保证同一时刻同一位置只可能出现一个点。一开始一个人可以在矩阵的任意位置出现,每秒钟可以走四个方向(上下左右),也可以停顿。求出最多能走过的所有点(当点出现时才算走过)
题解:
DP,因为点是在固定的时刻出现,所以我们定义f[i]表示必须走过i点的能走过的点数
参考代码:
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> using namespace std; struct node { int x,y,t; }a[11000]; int f[11000]; int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d%d",&a[i].t,&a[i].x,&a[i].y); } f[1]=1; for(int i=2;i<=m;i++) { f[i]=1; for(int j=i-1;j>=1;j--) { if((a[i].t-a[j].t)>=(abs(a[i].x-a[j].x)+abs(a[i].y-a[j].y))) { f[i]=max(f[i],f[j]+1); } } } int ans=0; for(int i=1;i<=m;i++) ans=max(f[i],ans); printf("%d\n",ans); return 0; }
渺渺时空,茫茫人海,与君相遇,幸甚幸甚