• 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;
    }
    
  • 相关阅读:
    app.config应该放哪?
    Connection 和Dispose的学习日志
    简单的sqlhelper的学习日志
    EF 事务(非分布式事务)
    Angularjs 地址联动2.1.1
    C# 如何物理删除有主外键约束的记录?存储过程实现
    C# 枚举基本用法及扩展方法
    JS 去除重复元素的方法
    MVC4程序运行报错
    ASP.NET MVC4 & Entity Framework 6.0 IIS 部署出错解决方案
  • 原文地址:https://www.cnblogs.com/xiaofrank/p/14324351.html
Copyright © 2020-2023  润新知