首页 > 其他 > 详细

CF484D Kindergarten 题解 贪心+DP

时间:2020-10-01 23:49:58      阅读:42      评论:0      收藏:0      [点我收藏+]

题目链接: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;
}

CF484D Kindergarten 题解 贪心+DP

原文:https://www.cnblogs.com/quanjun/p/13758986.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!