bzoj 1207 [HNOI2004]打鼹鼠 小技巧
Description
鼴鼠是一種很喜歡挖洞的動物,但每過一定的時間,它還是喜歡把頭探出到地面上來透透氣的。根據這個特點阿Q編寫了一個打鼴鼠的游戲:在一個n*n的網格中,在某些時刻鼴鼠會在某一個網格探出頭來透透氣。你可以控制一個機器人來打鼴鼠,如果i時刻鼴鼠在某個網格中出現,而機器人也處于同一網格的話,那么這個鼴鼠就會被機器人打死。而機器人每一時刻只能夠移動一格或停留在原地不動。機器人的移動是指從當前所處的網格移向相鄰的網格,即從坐標為(i,j)的網格移向(i-1, j),(i+1, j),(i,j-1),(i,j+1)四個網格,機器人不能走出整個n*n的網格。游戲開始時,你可以自由選定機器人的初始位置?,F在你知道在一段時間內,鼴鼠出現的時間和地點,希望你編寫一個程序使機器人在這一段時間內打死盡可能多的鼴鼠。
Input
第一行為n(n<=1000), m(m<=10000),其中m表示在這一段時間內出現的鼴鼠的個數,接下來的m行每行有三個數據time,x,y表示有一只鼴鼠在游戲開始后time個時刻,在第x行第y個網格里出現了一只鼴鼠。Time按遞增的順序給出。注意同一時刻可能出現多只鼴鼠,但同一時刻同一地點只可能出現一只鼴鼠。
Output
僅包含一個正整數,表示被打死鼴鼠的最大數目
題解:
十分簡單的 $O(m^2) $ DP.
不過,我們可以開一個 $mx$ 數組進行一下剪枝。其中,mx[i] 代表 1~i 中 f[i] 的最大值
Code:
#include<bits/stdc++.h>
#define setIO(s) freopen(s".in","r",stdin)
#define maxn 1000000
using namespace std;
int f[maxn],t[maxn],x[maxn],y[maxn],mx[maxn];
int main(){
// setIO("input");
int n,m,ans=0;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;++i) scanf("%d%d%d",&t[i],&x[i],&y[i]),f[i]=mx[i]=1;
for(int i=2;i<=m;++i) {
for(int j=i-1;j>=1;--j){
if(f[i]>mx[j]) break;
if(abs(x[i]-x[j])+abs(y[i]-y[j])<=t[i]-t[j]) f[i]=max(f[i],f[j]+1);
}
mx[i]=max(f[i],mx[i-1]);
}
printf("%d",mx[m]);
return 0;
}
總結
以上是生活随笔為你收集整理的bzoj 1207 [HNOI2004]打鼹鼠 小技巧的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: C# 递归、try
- 下一篇: Subversion安装和使用
