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;
}

 

 

 

posted @ 2017-09-19 21:27  Star_Feel  阅读(193)  评论(0编辑  收藏  举报