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;
}

浙公网安备 33010602011771号