动态规划_最长上升子序列LIS

来源:互联网 发布:java中反射的应用场景 编辑:程序博客网 时间:2024/06/08 04:29

最长上升最序列Longest Increasing Subsequence
动态规划解决的经典问题
子序列不等于子串,子串一定是自序列,但子序列不一定是子串
因为子串必须连续

将该题分解为n个子问题:
求解最后一个元素为原数组第i个元素的最长上升子序列 的长度

#include <iostream>#include <cstdio>using namespace std;int n, dp[101], num[101], result = 0;int main() {    scanf("%d", &n);    for (int i = 1; i <= n; ++i) {        scanf("%d", &num[i]);    }    // begin: 在下面实现动态规划的核心代码    for(int i=1;i<=n;++i){        //初始化每个子问题结果           dp[i]=1;        for(int j=1;j<i;++j){            if(num[j]<num[i]){                //如果i位置元素大于在其之前的j位置元素,将j位置长度加一                //如果加一后长度较大,则更新i位置长度                dp[i]=max(dp[j]+1,dp[i]);            }        }        result=max(result,dp[i]);    }    // end.    printf("%d\n", result);    return 0;}
0 0
原创粉丝点击