【问题标题】:Dynamic Programming (max sum)动态规划(最大和)
【发布时间】:2015-03-06 04:32:57
【问题描述】:

给定一个 n 个实数序列A(1) ... A(n),确定一个连续的子序列A(i) .. . A(j) 其子序列中的元素之和被最大化。

解决办法是:

M(j) = max sum over all windows ending in j

M(j) = max{M(j-1) +A[j], A[j]}

有人可以解释一下这对以下子序列是如何工作的: 1, 5, -10, 5。因为在第一个5 和-10 之间,循环在-4 (M(j-1) +A[j]) 或-10 (M(j-1) +A[j]) 的总和之间进行选择。但是,最好的总和是6。

那么重复不应该是:

M(j) = max{M(j-1) +A[j], A[j], M(j-1)}

【问题讨论】:

    标签: algorithm dynamic-programming


    【解决方案1】:

    正如你所说的M[j] = maximum sum over all windows ending at j。 所以在为0 和n - 1 之间的所有j 计算M[j] 之后。您输出其中的最大值。 这是 C++ 的示例代码。

    int findMax(int a[], int n){
        int * M = new int[n];
        M[0] = a[0];
        for(int i=1; i<n; i++)
            M[i] = max(M[i-1] + a[i], a[i]);
        int ans = M[0];
        for(int i=1; i<n; i++)
            ans = max(ans, M[i]);
    
        return ans;
    }
    

    为您的序列{1, 5, -10, 5}。 M = {1, 6, -4, 5} 答案是 M 中的最大值,即 6。

    【讨论】:

      猜你喜欢
      • 2010-12-16
      • 2021-06-25
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 2013-12-21
      相关资源
      最近更新 更多