动态规划之递增子序列最大和(Maximum Sum Increasing Subsequence)

原文地址:Dynamic Programming | Set 14 (Maximum Sum Increasing Subsequence)

已知一个含有n个正整数的数组,写一个程序能让其找到已知数组的子序列的最大和,也就是说子序列中的整数是递增排序的。例如,如果输入是:{1, 101, 2, 3, 100, 4, 5},那么输出应该就是106 (1 + 2 + 3 + 100),如果输入是:{3, 4, 5, 10},那么输出是22 (3 + 4 + 5 + 10),如果输入是 {10, 5, 4, 3},那么输出就是10。

这个问题是标准LIS问题的变种,我们只需稍稍改一下LIS问题动态规划的解法即可,我们所需要改变的就是将和作为衡量标准,而不是递增子序列的长度。

下面是这个问题的动态规划C++实现。

/* Dynamic Programming implementation of Maximum Sum Increasing
Subsequence (MSIS) problem */
#include

/* maxSumIS() returns the maximum sum of increasing subsequence
    in arr[] of size n */
int maxSumIS( int arr[], int n )
{
    int i, j, max = 0;
    int msis[n];

    /* Initialize msis values for all indexes */
    for ( i = 0; i < n; i++ )
        msis[i] = arr[i];

    /* Compute maximum sum values in bottom up manner */
    for ( i = 1; i < n; i++ )
        for ( j = 0; j < i; j++ )
            if ( arr[i] > arr[j] && msis[i] < msis[j] + arr[i])
                msis[i] = msis[j] + arr[i];

    /* Pick maximum of all msis values */
    for ( i = 0; i < n; i++ )
        if ( max < msis[i] )
            max = msis[i];

    return max;
}

/* Driver program to test above function */
int main()
{
    int arr[] = {1, 101, 2, 3, 100, 4, 5};
    int n = sizeof(arr)/sizeof(arr[0]);
    printf("Sum of maximum sum increasing subsequence is %d\n",
           maxSumIS( arr, n ) );
    return 0;
}

输出:

Sum of maximum sum increasing subsequence is 106

时间复杂度:O(n^2)
来源:http://qa.geeksforgeeks.org/topic/algorithm-1

你可能感兴趣的:(Dynamic,Programming)