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;
}
posted @ 2020-10-01 20:25  quanjun  阅读(124)  评论(0编辑  收藏  举报