M_sea

洛谷2285 [HNOI2004]打鼹鼠
Luogu分析这是一道DP题。用$f[i]$来表示到第$i$只地鼠最多能打的只数。那么对于每一个状态,都要在前面的...
扫描右侧二维码阅读全文
08
2017/09

洛谷2285 [HNOI2004]打鼹鼠

Luogu

分析

这是一道DP题。
用$f[i]$来表示到第$i$只地鼠最多能打的只数。
那么对于每一个状态,都要在前面的所有地鼠中选一只,然后直接过来打这一只。
决策就直接选最大即可。
状态转移方程也就列出了:

$f[i]=max\{f[j]+1\} (|x[i]-x[j]|+|y[i]-y[j]|\leq |time[i]-time[j]|)$

然后还有边界问题。这个不难想:因为机器人可从任意地方开始,所以$f[i]=1$

代码

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#define re register
using namespace std;
int x[10010],y[10010],t[10010],f[10010]; //f[i]表示到第i只地鼠最多能打的只数 
inline int read() //读入优化
{
    int X=0,w=1; char ch=0;
    while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
    return X*w;
}
int main()
{
    int n=read(),m=read(),ans=-1;
    for (re int i=1;i<=m;i++) t[i]=read(),x[i]=read(),y[i]=read(); //输入
    for (re int i=1;i<=m;i++) f[i]=1; //边界
    for (re int i=1;i<=m;i++) //DP
    {
        for (re int j=1;j<i;j++)
            if (abs(x[i]-x[j])+abs(y[i]-y[j])<=abs(t[i]-t[j]))
                f[i]=max(f[i],f[j]+1);
        ans=max(ans,f[i]); //更新答案
    }
    printf("%d\n",ans); //输出
    return 0;
}
最后修改:2019 年 05 月 26 日 02 : 08 PM

发表评论