0
    /* 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) をインデックス i までの LIS の長さとし、arr[i] が LIS の一部であり、arr[i] が LIS の最後の要素であるようにします。 L(i) は次のように再帰的に記述できます。L(i) = { 1 + Max ( L(j) ) } ここで、j < i および arr[j] < arr[i] であり、そのような j がない場合、L(i) = 1 です。

上記の実装では、条件の使用/重要性を理解できませんif (arr[i-1] < arr[n-1] && res + 1 > max_ending_here)。再帰式のようにも見えませんが、なぜそれが必要なのですか.いつ、なぜL(i)/*is just*/ = { 1 + Max ( L(j) ) } where j < i and arr[j] < arr[i] and if there is no such j then L(i) = 1比較する必要があるのですかarr[i-1] < arr[n-1]. 再帰的な式に似た再帰的なソリューションを提供することは可能ですか?

4

1 に答える 1