Kadane的算法是贪婪的还是优化的DP?

时间:2015-07-01 07:37:44

标签: algorithm dynamic-programming greedy

我觉得Kadane的算法是最大子阵列问题的真正动态编程解决方案的修改版本。为什么我感觉如此? 我觉得因为计算最大子阵列的方法可以通过:

for(i=0;i<N;i++)
    {
        DP[i][A[i]]=true;
        for(j= -ve maximum ;j<= +ve maximum ;j++)
        if(DP[i-1][j])
            DP[i][j+A[i]]=true;
    }

如果可能形成具有以i-1 元素结尾的子阵列的j,则重复出现我可以使用第i个元素形成 j + A [i] 并且通过在第i个位置启动子阵列来单独形成 A [i] 最后,我们可以在这个DP阵列中搜索标记为真的最大值!

注意:DP[i][j]表示是否可以使用以i结尾的子数组生成j!在这里我假设j也可以是负数。现在可以很容易地得出该总和+负数&lt;总和。这意味着添加任何负面指数都不会有助于获得更好的数额,这就是为什么我们可以放弃它们! Morover我们关心最大j直到i-1位置并将其与i th元素连接起来,这让我觉得它有点贪婪的选择(因为最大+元素给了我一个最大值)。 / p>

注意:我现在还没有学过贪婪算法,但我知道贪婪的选择是什么!

编辑:SOmeone说我的算法没有任何意义所以我试图发布我的代码以使自己清楚。我没有把j作为-ve因为它们没有成果。 我重复我的状态被定义为可以使用以i结尾的子数组来生成j​​。

#include<bits/stdc++.h>
using namespace std;
int DP[101][101];
int main()
{
    int i,j,ans=INT_MIN;
    int A[]={3,-1,2,-1,5,-3};
    int N=sizeof(A)/sizeof(int);
    for(i=1;i<=N;i++)
    {
        if(A[i-1]>=0)
            DP[i][A[i-1]]++;
        for(j=0;j<=100;j++)
        {
            if(DP[i-1][j])
            {
                if(j+A[i-1]>=0)
                    DP[i][j+A[i-1]]++;
            }
            if(DP[i][j])
                ans=max(ans,j);
        }
    }
    cout<<ans<<"\n";
    return 0;
}

输出8

4 个答案:

答案 0 :(得分:2)

Kadane's是一种迭代动态规划算法。

优化迭代DP算法以沿算法进程的主轴移除DP矩阵的一维是非常普遍的事。

例如,通常使用2D矩阵描述通常的“最长公共子序列”算法,但是如果该算法从左向右进行,则实际上只需要2列的空间。

Kadane的算法是应用于一维问题的类似优化方法,因此整个DP阵列都消失了。您的问题中的DP代码出于某些原因具有2D矩阵。我不知道为什么-这真的没有道理。

此网站在解释推导方面做得非常好:https://hackernoon.com/kadanes-algorithm-explained-50316f4fd8a6

答案 1 :(得分:1)

我认为这是一种贪婪算法,因为kadanes算法会在每个步骤中找到最大和,然后找到整体解。

答案 2 :(得分:0)

算法导论中所定义,“贪心算法总是做出目前看起来最好的选择。也就是说,它做出局部最优选择,希望这个选择会导致全局最优解。”

Kadane 的算法确实通过 current_sum = max(0, current_sum + x) 寻找局部最优解;同时,这也可以看作是空间优化的动态规划解决方案 - dp[i] 仅依赖于 dp[i-1],因此我们使用整数变量来节省空间。

所以我感觉DP的transition函数正好有贪心的样子,看起来既像DP又像贪婪。

答案 3 :(得分:-1)

我认为很难说这个算法到底是什么。
但是本书的大部分内容都是在DP部分对这个算法进行分类,因为你将dp [n-1]的解决方案结合起来为dp [n]做出解决方案。

注意:我不明白为什么你使用这个版本的O(n^2)算法 您可以将此算法简化为O(n)

curmax=0
sol=0
for x in array
    curmax+=a[x]
    if(curmax<0)curmax=0
    if(curmax>sol)sol=curmax