CF484D Kindergarten 题解 贪心+DP
题目链接:https://www.luogu.com.cn/problem/CF484D
解题思路:
贪心思想:所有串都是单调的,否则的话,将其分成若干个单调的串的结果一定比原结果更优。
所以只需要特判那些拐点是和它左边的串在一起还是和右边的串在一起即可。
定义状态 \(f[i]\) 表示 \([1,i]\) 范围内的元素分好组的最大值,则:
- 如果 \(a_{i-1}, a_{i-1}, a_i\) 单调,\(f[i] = f[i-1] + | a_i - a_{i-1} |\);
-否则(拐点),\(f[i] = \max \{ f[i-1], f[i-1] + | a_i - a_{i-1} | \}\)
示例代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1000010;
int n;
long long a[maxn], f[maxn];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i ++) scanf("%lld", a+i);
for (int i = 2; i <= n; i ++) {
if (a[i-2]<=a[i-1] && a[i-1]<=a[i] || a[i-2]>=a[i-1] && a[i-1]>=a[i]) f[i] = f[i-1] + abs(a[i] - a[i-1]);
else f[i] = max(f[i-1], f[i-2] + abs(a[i] - a[i-1]));
}
printf("%lld\n", f[n]);
return 0;
}