zoukankan      html  css  js  c++  java
  • 求数对之差的最大值

    题目

    数组中的一个数字减去它右边子数组中的一个数字可以得到一个差值,求所有可能的差值中的最大值。
    数组{1, 4, 17, 3, 2, 9}

    暴力法

    直接枚举i,j (j > i) 求max(a[i] - a[j])

    复杂度O(n^2)

    动态规划

    解法一

    设mx为当前到i-1位置的最大值,dp[i] 为当前到i位置的 差值中的最大值
    因此 显然有 dp[i] = max(dp[i-1], mx - a[i])
    差值中的最大值要么是之前i-1中的最大值,要么是mx - 当前值
    复杂度O(n)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int a[] = {1, 4, 17, 3, 2, 9};
        int n = 6;
        int mx = a[0];
        int dp[n] = {0};
        for(int i=1; i<n; i++) {
            dp[i] = max(s[i-1], mx - a[i]);
            mx = max(mx, a[i]);
            // cout << s[i] <<" " << mx <<endl;
        }
        cout<< dp[n-1] <<endl;
        return 0;
    }
    

    解法二

    设dp[i] = a[i] - a[i+1]
    那么 对于a[i] - a[j] 可以表示如下
    dp[i] + dp[i+1] +... + dp[j-1] = a[i] - a[i+1] + a[i+1] - a[i+2] + ... + a[j-1] - a[j]

    那么 这就是一个求最大字段和的问题
    复杂度O(n)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        int a[] = {1, 4, 17, 3, 2, 9};
        int n = 6;
        int mx = a[0];
        int dp[n] = {0};
        for(int i=0; i<n-1; i++) {
            dp[i] = a[i] - a[i+1];
        }
        int ans = 0;
        for(int i=0; i<n-1; i++) {
            if(ans < 0)
                ans = 0;
            ans += dp[i];
            mx = max(mx, ans);
        }
        cout<< mx <<endl;
        return 0;
    }
    
  • 相关阅读:
    C# 访问AD查询用户信息
    js UTC时间转本地时间
    Silverlight中的序列化和反序列化
    ASP.NET FORM认证配置排错记录
    opencv中cvSetData用法
    WS2812B-64位 8*8位 RGB LED点阵
    1602 LCDKeypad Shield
    Wemos D1 使用ESP8266 板载存储
    Wemos D1 ESP8266的网络工作模式
    Wemos D1 1602 液晶屏幕
  • 原文地址:https://www.cnblogs.com/Draymonder/p/10703443.html
Copyright © 2011-2022 走看看