223. 最长上升子序列问题(挑战程序设计竞赛)

地址 https://www.papamelon.com/problem/223

有一个长为 n 的序列 a_0, a_1,...,a_n 。
求出这个序列的最长上升子序列的长度。
上升子序列指的是对于任意的 i<j 都满足 a_i < a_j子序列。

输入
第一行为一个整数 n
第二行有 n 个整数表示序列 a
1≤n≤1000
1≤ai≤10^6
 
输出
一个整数,表示最长上升子序列的长度
样例 1
输入
5
4 2 3 1 5
输出
3

解答 动态规划
使用dp[i]记录 数组第i个数字能达到的上升子序列最大长度。
由于要知道i之后的数字是否能加入这个上升子序列,所以dp[i]的意义应该是数组第i个数字结尾的最大上升子序列的长度。
这样对于数组后面的数字i+1,i+2~~~~~n; 如果a[i+1]>a[i] 那么dp[i+1] = max(dp[i+1],dp[i]+1)
时间复杂度O(n^2)
代码如下

#include <iostream>
#include <memory.h>

using namespace std;

const int N = 1010;
int dp[N];
int a[N];
int n;

int main(){
    cin >>n;
    for(int i = 1;i <=n;i++) cin >> a[i];

    for(int i= 1;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);
            }
        }
    }

    int ans = 1;
    for(int i = 1;i <=n;i++){
        ans = max(ans,dp[i]);
    }
    cout << ans<<endl;

    return 0;
}

我的视频题解空间

posted on 2023-01-09 18:13  itdef  阅读(24)  评论(0编辑  收藏  举报

导航