1427C - The Hard Work of Paparazzi(dp + 简单优化)

本文介绍了一种使用动态规划解决实际问题的方法,针对给定的街道路网和行人出现时间,计算在起点(1,1)出发,如何在最短时间内接最多人的最优路径策略。通过维护dp数组和mx数组,有效地优化了时间复杂度,求得最大接人人数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:已知有r条从西到东的街道和r条从北到南的街道,之后有n行,每一行包含t_i,x_i,y_i,t_i表示t_i秒这个人出现在(x_i,y_i)这个点,假设当前你在(x,y)点,那么你到(x_i,y_i)去接这个人需要花费abs(x-x_i)+abs(y-y_i)的时间,开始你在起点(1,1),求你最多能够接多少个人

解法:考虑dp,dp[i]表示前i个人最多能够接多少个人,之后我们进行维护一个mx[i]表示维护对于[1,i-1]个人最多能够接多少个人,之后就可以通过mx数组进行优化即可

#include<bits/stdc++.h>
#define ll long long
#define sc scanf
#define pr printf
#define ull unsigned long long
using namespace std;
const int maxn = 1e5 + 5;
int t[maxn],x[maxn],y[maxn];
int dp[maxn],mx[maxn];
int main(){
	int r,n;
	sc("%d%d",&r,&n);
	for(int i = 1; i <= n; i++){
		sc("%d%d%d",&t[i],&x[i],&y[i]);
		dp[i] = -1;
	}
	int ans = 0;
	x[0] = y[0] = 1;
	for(int i = 1; i <= n; i++){
		for(int j = i-1; j >= 0; j--){
			if(dp[j] >= 0 && abs(x[i]-x[j])+abs(abs(y[i]-y[j])) <= t[i]-t[j]){
				dp[i] = max(dp[i],dp[j] + 1);
			}
			if(dp[i] >= mx[j] + 1)break;
		}
		ans = max(ans,dp[i]);
		mx[i] = max(mx[i - 1],dp[i]);
	}
	pr("%d\n",ans);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值