zoukankan      html  css  js  c++  java
  • 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
    ", f[n]);
        return 0;
    }
    
  • 相关阅读:
    我的第一篇博客
    文献笔记5
    文献笔记4
    文献笔记8
    文献笔记6
    文献笔记10
    文献笔记7
    文献笔记1
    文献笔记2
    文献笔记3
  • 原文地址:https://www.cnblogs.com/quanjun/p/13758986.html
Copyright © 2011-2022 走看看