【问题标题】:Absurd condition in Longest Increasing Subquence最长递增子序列中的荒谬条件
【发布时间】:2013-07-04 14:23:43
【问题描述】:
    /* A Naive recursive implementation of LIS problem */
    #include<stdio.h>
    #include<stdlib.h>

    /* To make use of recursive calls, this function must return two things:
       1) Length of LIS ending with element arr[n-1]. We use max_ending_here
          for this purpose
       2) Overall maximum as the LIS may end with an element before arr[n-1]
          max_ref is used this purpose.
    The value of LIS of full array of size n is stored in *max_ref which is our final result
    */
    int _lis( int arr[], int n, int *max_ref)
    {
        /* Base case */
        if(n == 1)
            return 1;

        int res, max_ending_here = 1; // length of LIS ending with arr[n-1]

        /* Recursively get all LIS ending with arr[0], arr[1] ... ar[n-2]. If
           arr[i-1] is smaller than arr[n-1], and max ending with arr[n-1] needs
           to be updated, then update it */
        for(int i = 1; i < n; i++)
        {
            res = _lis(arr, i, max_ref);
            if (arr[i-1] < arr[n-1] && res + 1 > max_ending_here)
                max_ending_here = res + 1;
        }

        // Compare max_ending_here with the overall max. And update the
        // overall max if needed
        if (*max_ref < max_ending_here)
           *max_ref = max_ending_here;

        // Return length of LIS ending with arr[n-1]
        return max_ending_here;
    }

    // The wrapper function for _lis()
    int lis(int arr[], int n)
    {
        // The max variable holds the result
        int max = 1;

        // The function _lis() stores its result in max
        _lis( arr, n, &max );

        // returns max
        return max;
    }

    /* Driver program to test above function */
    int main()
    {
        int arr[] = { 10, 22, 9, 33, 21, 50, 41, 60 };
        int n = sizeof(arr)/sizeof(arr[0]);
        printf("Length of LIS is %d\n",  lis( arr, n ));
        getchar();
        return 0;

令 arr[0..n-1] 为输入数组,L(i) 为 LIS 的长度,直到索引 i 使得 arr[i] 是 LIS 的一部分,而 arr[i] 是最后一个元素在 LIS 中,则 L(i) 可以递归地写为。 L(i) = { 1 + Max ( L(j) ) } 其中 j

在上述实现中,我无法理解条件if (arr[i-1] &lt; arr[n-1] &amp;&amp; res + 1 &gt; max_ending_here) 的使用/重要性。它甚至不像递归公式,那为什么需要它。当L(i)/*is just*/ = { 1 + Max ( L(j) ) } where j &lt; i and arr[j] &lt; arr[i] and if there is no such j then L(i) = 1 时,我们为什么需要比较arr[i-1] &lt; arr[n-1]。有没有可能出一个类似于递归公式的递归解?

【问题讨论】:

    标签: c arrays algorithm recursion sequences


    【解决方案1】:

    LIS:这里有一个遵循LIS定义的简单解决方案。 假设 A 是输入的数字数组,NA 的大小。

    int L[51];
    int res=-1;
    for(int i=0;i<N;i++)
    {
     L[i]=1;
     for(int j=0;j<i;j++)
      if(A[j]<A[i])
      {
        L[i]=max(L[i],L[j]+1);
      }
     res=max(res,L[i]);
    }
    return res;
    

    时间复杂度:O(N2)。

    【讨论】:

      猜你喜欢
      • 2013-07-03
      • 1970-01-01
      • 1970-01-01
      • 2020-04-15
      • 1970-01-01
      • 2018-11-01
      相关资源
      最近更新 更多