zoukankan      html  css  js  c++  java
  • 51nod 1270 数组的最大代价

    1270 数组的最大代价
    题目来源: HackerRank
    基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题

    数组A包含N个元素A1, A2......AN。数组B包含N个元素B1, B2......BN。并且数组A中的每一个元素Ai,都满足1 <= Ai <= Bi。数组A的代价定义如下:
     
     
    (公式表示所有两个相邻元素的差的绝对值之和)
    给出数组B,计算可能的最大代价S。
    Input
    第1行:1个数N,表示数组的长度(1 <= N <= 50000)。
    第2 - N+1行:每行1个数,对应数组元素Bi(1 <= Bi <= 10000)。
    Output
    输出最大代价S。
    Input示例
    5
    10
    1
    10
    1
    10
    Output示例
    36
    /*
    51nod 1270 数组的最大代价
    
    problem:
    数组A包含N个元素A1, A2......AN。数组B包含N个元素B1, B2......BN。并且数组A中的每一个元素Ai,都满足1 <= Ai <= Bi。
    数组A的代价定义如下:
    两个相邻元素A的差的绝对值之和
    
    solve:
    按照贪心的思路来,感觉肯定是取 B[i]或者1.  所以第i步的情况应该是由i-1推过来的.
    但是写的时候,觉得如果第i位如果取最大值,那么i-1就取最小值mdzz,所以少了一些情况. 实际上i-1的最大最小值都应该考虑.
    
    hhh-2016/09/03 13:32:28
    */
    #pragma comment(linker,"/STACK:124000000,124000000")
    #include <algorithm>
    #include <iostream>
    #include <cstdlib>
    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <math.h>
    #include <queue>
    #include <set>
    #include <map>
    #define lson  i<<1
    #define rson  i<<1|1
    #define ll long long
    #define clr(a,b) memset(a,b,sizeof(a))
    #define scanfi(a) scanf("%d",&a)
    #define scanfs(a) scanf("%s",a)
    #define scanfl(a) scanf("%I64d",&a)
    #define scanfd(a) scanf("%lf",&a)
    #define key_val ch[ch[root][1]][0]
    #define eps 1e-7
    #define inf 0x3f3f3f3f3f3f3f3f
    using namespace std;
    const ll mod = 1e9+7;
    const int maxn = 50010;
    const double PI = acos(-1.0);
    
    ll dp[maxn][2];
    ll a[maxn];
    int main()
    {
        int n;
        while(scanfi(n) != EOF)
        {
            clr(dp,0);
            for(int i = 1;i <= n;i++)
            {
                scanfl(a[i]);
            }
    //        dp[1][1] = a[1];
    //        dp[1][0] = 1;
            for(int i =2; i<=n;i++)
            {
                dp[i][1] = dp[i-1][0] + a[i] - 1LL;
                dp[i][0] = dp[i-1][1] + a[i-1] - 1LL;
                dp[i][1] = max(dp[i-1][1] + (a[i] - a[i-1]),dp[i][1]);
                dp[i][0] = max(dp[i-1][0],dp[i][0]);
            }
            printf("%I64d
    ",max(dp[n][0],dp[n][1]));
        }
        return 0;
    }
    

      

  • 相关阅读:
    如何删除完全重复的列
    串联多个字符串,引发string和stringBuilder的比较
    借鉴ANJOU的方法改写了上次的TreeView
    如何改变ListBox中内容的顺序
    执行Insert语句时使用string的Format用法
    moss 2007 中FCKEditor编辑器的使用
    qt 获得cmd 命令运行的结果 GIS
    迭代器 GIS
    win32 创建带图片的button GIS
    c++标准库的构成 GIS
  • 原文地址:https://www.cnblogs.com/Przz/p/5836870.html
Copyright © 2011-2022 走看看