首页 > Windows开发 > 详细

AcWing 895. 最长上升子序列

时间:2019-11-19 09:04:41      阅读:92      评论:0      收藏:0      [点我收藏+]
//设上升序列的最后一个数字为第i个,那么就以第i-1个位分类标准,
//i-1可以没有,也可以是在数组中下标为1,下标为2
//一直到下标为i-1的数字 
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int n;
int a[N], f[N];
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
    for (int i = 1; i <= n; i ++ ) {
        f[i] = 1; // 开始假设有a[i]一个数
        for (int j = 1; j < i; j ++ )
            if (a[j] < a[i])//是否满足上升
                f[i] = max(f[i], f[j] + 1);
    }
    int res = 0;
    for (int i = 1; i <= n; i ++ ) res = max(res, f[i]);

    printf("%d\n", res);

    return 0;
}

 

 

输出路径

#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010;
int n;
int a[N], f[N];
int g[N];//存储每一个转移是怎么转移过来的,每一个转移是怎么做出来的  
int main() {
    scanf("%d", &n);
    for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
    for (int i = 1; i <= n; i ++ ) {
        f[i] = 1; // 开始假设有a[i]一个数
        g[i]=0;//如果为0,表示只有一个数 
        for (int j = 1; j < i; j ++ )
            if (a[j] < a[i])//是否满足上升
                if(f[i]<f[j]+1) {
                    f[i]=f[j]+1;
                    g[i]=j;//i状态是从j状态转移过来的 
                }
    }
    int k=1;//记录最优解的下标 
    for(int i=1; i<=n; i++)
        if(f[k]<f[i])
            k=i;
    cout<<f[k]<<endl;//输出最大长度 
    for(int i=0,len=f[k]; i<len; i++) {//一共f[k]个值 
        cout<<a[k]<<" ";//因为f[k]是以第k个数字结尾的序列,所以先把第k个输出 
        k=g[k];//从哪个转移过来 
    }
    return 0;
}

 

AcWing 895. 最长上升子序列

原文:https://www.cnblogs.com/QingyuYYYYY/p/11886727.html

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