题解 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$~

posted @ 2020-11-01 18:49  ffffyc  阅读(29)  评论(0)    收藏  举报  来源