Vijos P1441 打鼴鼠

Vijos P1441 打鼴鼠


題目

背景

鼴鼠是一種很喜歡挖洞的動物,但每過一定的時間,它還是喜歡把頭探出到地面上來透透氣的。
描述

根據這個特點阿Q編寫了一個打鼴鼠的遊戲:在一個n*n的網格中,在某些時刻鼴鼠會在某一個網格探出頭來透透氣。你可以控制一個機器人來打鼴鼠,如果i時刻鼴鼠在某個網格中出現,而機器人也處於同一網格的話,那麼這個鼴鼠就會被機器人打死。而機器人每一時刻只能夠移動一格或停留在原地不動。機器人的移動是指從當前所處的網格移向相鄰的網格,即從座標爲(i,j)的網格移向(i-1, j),(i+1, j),(i,j-1),(i,j+1)四個網格,機器人不能走出整個n*n的網格。遊戲開始時,你可以自由選定機器人的初始位置。
現在你知道在一段時間內,鼴鼠出現的時間和地點,希望你編寫一個程序使機器人在這一段時間內打死儘可能多的鼴鼠。
格式

輸入格式

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

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

樣例輸入1

2 2
1 1 1
2 2 2

樣例輸出1

1

限制

各個測試點1s


題解

DP

首先,如果要打某個時間 i 時的某個鼴鼠的位置 (x1,y1) 一定是從前面某個時間 j 時的某個鼴鼠的位置 (x2,y2) 走過來的或者是作爲起始點

所以狀態轉移的時候只要判斷 i -j 是否大於 abs (x1 -x2 )+abs (y1 -y2 ) 即可

然後我們還可以優化一下

如果狀態轉移相差的時間超過改點到四個角的最大值,那麼就不用繼續做這個點了,因爲,這前面的點一定會轉移到已經判斷並轉移過的點裏。


代碼

#include<cstdio>
using namespace std;

int n,m,ans;
int x[10005],y[10005],f[10005],t[10005];

int readln()
{
    int x=0;
    char ch=getchar();
    while (ch<'0'||ch>'9') ch=getchar();
    while ('0'<=ch&&ch<='9') x=x*10+ch-48,ch=getchar();
    return x;
}

int abs(int x){return x<0?-x:x;}

int dist(int a,int b){return abs(x[a]-x[b])+abs(y[a]-y[b]);}

int max(int x,int y){return x>y?x:y;}

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