• 求数对之差的最大值


    题目

    数组中的一个数字减去它右边子数组中的一个数字可以得到一个差值,求所有可能的差值中的最大值。
    数组{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;
    }
    
  • 相关阅读:
    百度搜索技巧
    phpstorm知识点
    A-Z
    边框
    display
    布局
    盒模型
    浮动
    字体与图标
    pselect 问题
  • 原文地址:https://www.cnblogs.com/Draymonder/p/10703443.html
Copyright © 2020-2023  润新知