Problem E: [HNOI2004]打鼴鼠 D1 T1

[HNOI2004]打鼴鼠 D1 T1

Description

鼴鼠是一種很喜歡挖洞的動物,但每過一定的時間,它還是喜歡把頭探出到地面上來透透氣的。根據這個特點阿牛編寫了一個打鼴鼠的遊戲:在一個n*n的網格中,在某些時刻鼴鼠會在某一個網格探出頭來透透氣。你可以控制一個機器人來打鼴鼠,如果i時刻鼴鼠在某個網格中出現,而機器人也處於同一網格的話,那麼這個鼴鼠就會被機器人打死。而機器人每一時刻只能夠移動一格或停留在原地不動。機器人的移動是指從當前所處的網格移向相鄰的網格,即從座標爲(i,j)的網格移向(i-1, j),(i+1, j),(i,j-1),(i,j+1)四個網格,機器人不能走出整個n*n的網格。遊戲開始時,你可以自由選定機器人的初始位置。

現在知道在一段時間內,鼴鼠出現的時間和地點,請編寫一個程序使機器人在這一段時間內打死儘可能多的鼴鼠。

Input

文件第一行爲n(n< =1000), m(m< =10000),其中m表示在這一段時間內出現的鼴鼠的個數,接下來的m行每行有三個數據time,x,y表示有一隻鼴鼠在遊戲開始後time個時刻,在第x行第y個網格里出現了一隻鼴鼠。Time按遞增的順序給出。注意同一時刻可能出現多隻鼴鼠,但同一時刻同一地點只可能出現一隻鼴鼠。

Output

輸出文件中僅包含一個正整數,表示被打死鼴鼠的最大數目。

Sample Input

2 2
1 1 1
2 2 2

Sample Output

1

Solution

看到這道題我首先想到的是一個類似的題目,大意是一個人在一個平面上可以左右移動,然後t[i]時間內在某個位置會掉下金錢來,然後求怎樣獲得最大金錢數。但是仔細想想發現這道題看起來比那個更復雜(因爲是二維)但是實際上最樸素的方法也很容易想到。
設f[i]爲打到第i個鼴鼠時的最大值,那麼ans=max{f[i]} 1<=i<=m;因爲題目規定t爲升序,那麼對於:
abs(x[i]-x[j])+abs(y[i]-y[j])<=t[j]-t[i](i+1<=j<=m)則可以到達,然後就顯然了。
Add:
f[i]的初始值爲1,而且本題和n無關係,看來DP是一個只有懂的人才能完成好的遊戲,唉,路漫漫其修遠兮…
Code:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAXN 10000
int n,m;
int f[MAXN<<1];
int t[MAXN],x[MAXN],y[MAXN];
int max(int a,int b){return a>b?a:b;}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&t[i],&x[i],&y[i]);
        f[i]=1;
    }

    int ans=0;
    for(int i=1;i<=m;i++)
    {
        for(int j=i+1;j<=m;j++)
        {
            if(abs(x[i]-x[j])+abs(y[i]-y[j])<=t[j]-t[i])
            {
                f[j]=max(f[j],f[i]+1);
            }
        }
        ans=max(ans,f[i]);
    }
    printf("%d\n",ans);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章