洛谷题单指南-动态规划2-P2285 [HNOI2004] 打鼹鼠

原题链接:https://www.luogu.com.cn/problem/P2285

题意解读:计算在地鼠出现的时间内能打到的最多的地鼠数量。

解题思路:

由于地鼠按时间出现,打到的地鼠序列一定是时间递增的,可以联想到最长上升子序列模型。

不妨设dp[i]表示以第i个地鼠结束的最多地鼠数量

参考最长上升子序列模型可以推出递推关系:

dp[i] = max(dp[i], dp[j] + 1),j取1到i-1

那么什么情况下才能从dp[j]转移到dp[i]呢,在最长上升子序列中要求a[j]<a[i]

而在本题中,其实是从j走到i的最短时间(即移动的距离)不能超过第i,j个地鼠出现的时间之差

而在本题的空间中,从一个点(x1,y1)走到另外一个点(x2,y2)的最短距离计算方式为 | x1-x2 | + | y1-y2 |

根据以上分析,就可以套用LIS模版实现代码。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 10005;
struct
{
    int t, x, y;
} a[N]; //保存所有地鼠
int dp[N]; //dp[i]表示以第i个地鼠结束最多能打的地鼠
int n, m;

int main()
{
    cin >> n >> m;
    for(int i = 1; i <= m; i++) cin >> a[i].t >> a[i].x >> a[i].y;

    for(int i = 1; i <= m; i++)
    {
        dp[i] = 1;
        for(int j = 1; j < i; j++) //类似最长上升子序列的结构
        {
            //从第j个地鼠能否走到第i个地鼠,关键在第i个地鼠的时间和第j个地鼠的时间之差要大于等于其最短路径长度
            //两个点(x1,y1),(x2,y2)之间的的最短路径长度是abs(x1-x2)+abs(y1-y2)
            if(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] + 1);
        }
    }
    int ans = 0;
    for(int i = 1; i <= m; i++) ans = max(ans, dp[i]);
    cout << ans;

    return 0;
}

 

posted @   五月江城  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示