首页 > 编程语言 > 详细

C++9018:1202——[TYVJ]最长不下降子序列

时间:2021-05-22 23:16:56      阅读:17      评论:0      收藏:0      [点我收藏+]

题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1202

技术分享图片

题目讲解:

这道题是一道经典的DP最长上升子序列问题(LIS),我们设d(i)为该序列前i个元素的最长上升子序列,则状态转移方程也就不难列出来:d(i) = max{0,d(j) | j < i,ai <= aj},用a[i][0]表示原数,a[i][1]表示d(i),也可以列出一个表格:

元素(i) 1 2 3
A[i][0] 1 3 2
A[i][1] 1 2 2
#include <iostream>
#include <cstring>
using namespace std;

int main(){
    int n,a[100001][2],ans = 0;
    cin >> n;
    a[0][0] = a[0][1] = 0;
    for (int i = 1;i <= n;i++) cin >> a[i][0];
    for (int i = 1;i <= n;i++){
        for (int j = i;j >= 0;j--){
            if (a[i][0] >= a[j][0]) a[i][1] = max(a[i][1],a[j][1]+1);
        } 
    }
    for (int i = 1;i <= n;i++) ans = max(ans,a[i][1]);
    cout << ans;
    return 0;
}

C++9018:1202——[TYVJ]最长不下降子序列

原文:https://www.cnblogs.com/linyiweiblog/p/14799832.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!