zoukankan      html  css  js  c++  java
  • Codeforces 484(#276 Div 1) D Kindergarten DP

    题意:给你一个数组,让你把连续的数分为一组,每一组的值为这一组数中的极差,问你这个怎样分组才能使得数组的极差和最大

    解题思路:

    可以分成 4种情况讨论

    dp[i]  表示前 i+1项能得到的最大值

             状态                                       状态转移方程

    a[i-1] < a[i]  < a[i+1]        dp[i] = dp[i-1] + a[i+1] - a[i]

    a[i-1] > a[i]  < a[i+1]        dp[i] = max(dp[i-1],dp[i-2] + a[i+1] -a[i])

    a[i-1] > a[i]  > a[i+1]        dp[i] = dp[i-1] - a[i+1] + a[i]

    a[i-1] < a[i]  > a[i+1]        dp[i] = max(dp[i-1],dp[i-2] - a[i+1] +a[i])

     dp[n-1] 就是我们所求 

    解题代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<algorithm>
     4 
     5 using namespace std;
     6 
     7 typedef long long ll;
     8 
     9 const int maxn=1000010;
    10 
    11 ll dp[maxn];
    12 int a[maxn];
    13 
    14 int main()
    15 {
    16    int n;scanf("%d",&n);
    17    for (int i=1;i<=n;i++) scanf("%d",&a[i]);
    18    dp[0]=0;
    19    for (int i=1;i<n;i++)
    20       if (a[i+1]>=a[i])
    21       {
    22          if ((i==1)||(a[i]>=a[i-1])) dp[i]=dp[i-1]+a[i+1]-a[i]; else dp[i]=max(dp[i-1],dp[i-2]+a[i+1]-a[i]);
    23       }
    24       else
    25       {
    26          if ((i==1)||(a[i]<a[i-1])) dp[i]=dp[i-1]-a[i+1]+a[i]; else dp[i]=max(dp[i-1],dp[i-2]-a[i+1]+a[i]);
    27       }
    28    cout<<dp[n-1]<<endl;
    29    return 0;
    30 }
    View Code

    from  SanSiroWaltz

    经过学弟提醒 发现一种更神的做法

     1 #include <bits/stdc++.h>
     2 #define ll long long
     3 using namespace std;
     4 ll ans, cx, cy, n,x;
     5 int main() {
     6     ios::sync_with_stdio (0);
     7     cin >> n;
     8     for (int i = 0; i < n; ++i) {
     9               cin>>x;
    10         if (!i || ans - x > cx) cx = ans - x;
    11         if (!i || ans + x > cy) cy = ans + x;
    12         ans = max (ans, cx + x);
    13         ans = max (ans, cy - x);
    14     }
    15     cout << ans;
    16     return 0;
    17 }
    View Code
    没有梦想,何谈远方
  • 相关阅读:
    String cannot applied 202010231141
    Dos命令快速删除文件和文件夹202007210924
    在共享文件夹可以直接右键选择映射成本地磁盘20200703
    CMD不能正常使用ping命令 202006301610
    Burp Suite测试Bug2020061801
    java正则表达式匹配电子邮件地址20200608
    [国家集训队]矩阵乘法
    一个极其常见的式子
    AHOI2018 Day1
    [AHOI2013]作业
  • 原文地址:https://www.cnblogs.com/zyue/p/4079043.html
Copyright © 2011-2022 走看看