• AcWing 895. 最长上升子序列 线性dp


    //设上升序列的最后一个数字为第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
    ", 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;
    }
  • 相关阅读:
    Sublime Text 3专题
    00.PHP学习建议
    php面试题及答案收藏(转)
    (转)如何快速掌握一门技术
    最全的MySQL基础【燕十八传世】
    UEditor编辑器并不难
    学习一门语言难在什么地方?
    PHP中关于位运算符 与 或 异或 取反
    WebP是什么图片格式?你了解PNG、JPG、WebP和GIF的区别吗?
    Mysql 外键设置
  • 原文地址:https://www.cnblogs.com/QingyuYYYYY/p/11886727.html
Copyright © 2020-2023  润新知