P5146 最大差值 DP写法

题目

看到没有动态规划的写法,但是标签又有这个,然后题解区也没有写,所以我决定写一篇来水一下题解

题目描述

对于一个序列 \(A_1,A_2,\cdots,A_n\),找出两个数 \(i,j\)\(1\le i<j\le n\)),使得 \(A_j-A_i\) 最大。注意到二者下标,并不是最大减最小就是答案,对于每一个下标 \(i\),我们都要保存当前 \(i-1\) 之前遇到的最小值,然后简简单单转移即可,详见代码。

代码实现

#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int range = 1e6 + 5;
int n;
int dp[range];
int a[range];
void solve() {
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	dp[0] = 1e10;
	for (int i = 1; i <= n; i++)
		dp[i] = min(dp[i - 1], a[i]);
	int maxn = -1e10;
	for (int i = 2; i <= n; i++) {
		maxn = max(a[i] - dp[i - 1], maxn);
	}
	cout << maxn;
}
signed main() {
	ios::sync_with_stdio();
	cin.tie(0);
	cout.tie(0);
	solve();
	return 0;
}
posted @ 2025-04-16 19:59  LteShuai  阅读(20)  评论(0)    收藏  举报