動態規劃專題:BZOJ1207

題目描述:

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

大致思路:

很容易看出來是一個動態規劃,於是可以定義一個狀態f[i]表示打中第i個鼴鼠和前面某些鼴鼠所能得到的最大得分。那麼轉移方程就很簡單就是f[i] = max{f[j]+1},其中j爲滿足條件的那一個鼴鼠。有了這個方程之後,計算就變得十分簡單了。

代碼:

#include <cmath>
#include <cstring>
#include <cstdio>


#define max(a,b) a<b?b:a


using namespace std;


int n,m,f[10001],x[10001],y[10001],tim[10001],MX;


int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;++i){
        scanf("%d%d%d",&tim[i],&x[i],&y[i]);
        for(int j=i-1;j>=1;--j)
            if(fabs(x[i]-x[j])+fabs(y[i]-y[j])<=tim[i]-tim[j])
                f[i]=max(f[i],f[j]+1);
        MX=max(MX,f[i]);
    }
    printf("%d\n",MX+1);
}


發佈了90 篇原創文章 · 獲贊 0 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章