zoukankan      html  css  js  c++  java
  • ACwing895. 最长上升子序列

    题目:
    给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。

    输入格式:
    第一行包含整数N。

    第二行包含N个整数,表示完整序列。

    输出格式:
    输出一个整数,表示最大长度。

    数据范围:

    [1 leq N leq 1000, −10^9 leq 数列中的数 leq 10^9 ]

    输入样例:

    7
    3 1 2 1 8 5 6
    

    输出样例:

    4
    

    思路:
    首先要知道状态划分此时可以用一维表示、就直接想到f[i]了。其次、该集合表示的是所有以a[i]结尾的上升子序列、我们只需要在这些子序列中求出一个最大的即可。如何划分呢?想到从倒数第一个数开始、发现倒数第一个数可能为空、也可能为1、故从倒数第二个数开始分析、求出最大的序列、最后一列数加上1即为所求。划分依据是最后一个不同的点。

    代码:

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 1010;
    
    int n;
    int a[N];
    int 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;   //只有一个数的情况
            for(int j = 1 ; j <= i ; j ++)
            {
                if(a[j] < a[i]) //如果该数在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;
    }
    
  • 相关阅读:
    jdk环境变量配置(默认安装在c盘下)
    Less使用笔记
    Bootstrap4元素显示和隐藏
    npm常见命令及参数用法
    详解:cssrem插件 -- VS Code px转rem神器
    关于position:fixed的注意点
    解决:无法push到远程仓储
    解决:'git' 不是内部或外部命令,也不是可运行的程序
    小程序3-地图定位2
    转-前端开发流程
  • 原文地址:https://www.cnblogs.com/xiaofrank/p/14324351.html
Copyright © 2011-2022 走看看