题解 P2285 【[HNOI2004]打鼹鼠】
P2285 [HNOI2004]打鼹鼠
传送门
思路
由题知,一次只能向四个方向走 $1$ 步,所以从一个点($x1,y1$)到另一个点($x2,y2$)的最短距离则为这两个点的曼哈顿距离($abs(x1-x2)+abs(y1-y2)$)。
如果 $t1$ 在($x1,y1$)有一只鼹鼠,$t2$($t1<=t2$)在($x2,y2$)有一只鼹鼠,则 $t2-t1\leqslant abs(x1-x2)+abs(y1-y2)$ 时可以打到两只鼹鼠,否则只能打一只。
有了这个思路,我们可以写出一个简单的 $dp$,类似于最长上升子序列,此值便为答案。
由于要打到这只鼹鼠必须在这个时间站在这只鼹鼠的点,所以这个操作无后效性,$dp$ 不会出错。
$code:$
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
int n,m,t,x,y,ans,dp[N],maxn;
struct node{
int x,y,t;
}a[N];
inline int read(){
char ch=getchar();
int x=0,f=1;
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=getchar();
return x*f;
}
int main(){
n=read(),m=read();
for(int i=1;i<=m;i++){
a[i].t=read(),a[i].x=read(),a[i].y=read();
}
for(int i=1;i<=m;i++){
for(int j=1;j<i;j++){
if(abs(a[i].t-a[j].t)>=abs(a[i].x-a[j].x)+abs(a[i].y-a[j].y)){
dp[i]=max(dp[i],dp[j]);
}
}
maxn=max(maxn,++dp[i]);
}
printf("%d",maxn);
return 0;
}
那就再见了$qwq$~

浙公网安备 33010602011771号