【问题标题】:Maximum increasing subsequence with dynamic programming动态规划的最大递增子序列
【发布时间】:2011-02-03 16:37:18
【问题描述】:

问题如下: 给定一个由 n 个整数组成的序列 L 不一定不同,编写一个算法来计算最大长度的递增子序列:

我开发的递归方程是这样的:

我从0开始索引:

If j = n opt(j) = 0 (base case)
otherwise opt(j) = max j <i <= n such that Lj <Li = {opt(i) +1}

你认为这样做是对的吗?用于这个典型问题的标准解决方案是首先计算序列中所有元素以 Li 结尾的最大递增子序列,然后计算这些值的最大值,即:

if i = 1 opt (i) = 1
otherwise opt (i) = max 1 <= j <= i-1 and Lj <Li = {opt (i)} +1

然后是这些元素的最大值。

所以我想知道你是否认为我的解决方案是正确的。

【问题讨论】:

  • 为什么你想要一个在 O(N^2) 中运行的动态编程解决方案,而已经存在一个可以在 O(N logN) 中完成的二进制搜索解决方案?见stackoverflow.com/questions/6129682/…

标签: algorithm dynamic-programming


【解决方案1】:

这里有一个提示:将试图在算法中保留的循环不变量是一个变量,k = 最长递增子序列开始的索引。因此,当您遍历整数序列 [0...n] 时,您会相应地增加 k 值。

【讨论】:

    【解决方案2】:

    // 给定一个整数数组,求最长递增子序列的长度并打印序列。

    int longsub (int a[], int len) {
    
        int localsum = 0;
        int i = 0;
        int begin = i;
        int localsublen = 1;
        int globalsunlen = 0;
        int end = i;
    
        for (i=1; i< len; i++)    {
    
            if (a[i] > a[i-1]) {
                  localsublen++;
            }
            else {
                newbegin = i;
                localsublen = 1;
            }
    
            if (localsublen > globalsublen)    {
                begin = newbegin;
                end = i;
                globalsublen = localsublen;
            }
        }
    
        for (i=begin;i <= end; i++)    
            printf ("%d.\n",a[i]);
    
    
    }
    

    【讨论】:

    • 我不认为这是正确的。例如,考虑 [1,5,6,2,7],您的代码将导致 [1,5,6] 但实际上最佳值是 [1,5,6,7]。
    猜你喜欢
    • 2017-04-26
    • 2016-05-02
    • 2012-10-25
    • 2011-02-07
    • 2017-04-09
    • 2018-03-17
    • 2019-05-28
    • 1970-01-01
    • 2016-09-30
    相关资源
    最近更新 更多