洛谷题单指南-动态规划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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)