编程语言
首页 > 编程语言> > 程序设计-求解最长递增子序列(C++)

程序设计-求解最长递增子序列(C++)

作者:互联网

分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net

/*
 * 问题:求解最长递增子序列。
 *
 * 分析:
 * 方法:动态规划。
 * 设计状态:记f(i)为以a[i]结尾的LIS长度,那么LIS=max{f(i)}。
 * 推导:考虑比i小的每一个j,如果a[i]>a[j],那么f(i)=f(j)+1。
 * 状态转移方程:f(i)=max{f(j)}+1;其中当i>j时,a[i]>a[j]。
 *
 * LongestIncreasingSubsequence.cpp - by LiveEveryDay
 */

#include <algorithm>

using namespace std;

int LIS(const int a[], int n) {
    int dp[n];
    int nMax = 1;
    for (int i = 0; i < n; i++) {
        dp[i] = 1;
        for (int j = 0; j < i; j++) {
            if (a[i] > a[j]) {
                dp[i] = max(dp[i], dp[j] + 1);
            }
        }
        if (dp[i] > nMax) {
            nMax = dp[i];
        }
    }
    return nMax;
}

int main() {
    int a1[] = {1, -1, 2, -3, 4, -5, 6, -7};
    printf("%d\n", LIS(a1, 8));
    int a2[] = {1, 4, 3, 2, 6, 5};
    printf("%d\n", LIS(a2, 6));
}

// ------ Output ------
/*
4
3
*/

标签:nMax,int,max,递增,printf,C++,LIS,程序设计,dp
来源: https://blog.csdn.net/chimomo/article/details/122340696