#546. 最长不下降序列(LIS)

题目链接:登录 - 沐枫OJ

思路:动态规划

/*
b(n-1) < b(n) , 长度为2,序列: b(n-1)b(n)
b(n-1) > b(n) , 长度为1,序列:b(n-1)和b(n) 
b(i):从b(i+1)b(i+2)....b(n) ,找出比b(i)大的 且最长的不下降序列 
*/ 
#include <iostream>
using namespace std;
const int N = 107;
int a[N];//存储数据 
int len[N];//len[i]:第i个数到达n的最长不下降序列的长度
int nx[N]; //nx[i]:第i个数据的下一个数据的下标 
int main(){
    int n = 1;
    while(cin>>a[n])
        n++;
    n--;
    len[n] = 1;//将最后一位数据的序列长度设为1
    int mxid = n;//记录所有数据中最长不下降序列的下标 
    for(int i = n-1;i >= 1;i--){
        int id = i; //i+1~n寻找最长的序列的长度,并记录下标 
        for(int j = i+1;j <= n;j++){
            if(a[j]>a[i]&&len[j]>len[id])
                id = j; //第j个数的长度的最长的,记录id 
        }
        len[i] = len[id] + 1;
        nx[i] = id;
        if(len[i]>len[mxid]) mxid = i; 
    }
    cout << len[mxid] << endl; //输出长度
    int l = len[mxid];
    for(int i = 1;i <= l;i++){
        cout << a[mxid] << " ";
        mxid = nx[mxid];
    } 
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值