zoukankan      html  css  js  c++  java
  • 51nod--1134 最长递增子序列 (动态规划)

    题目:

    给出长度为N的数组,找出这个数组的最长递增子序列。(递增子序列是指,子序列的元素是递增的)
    例如:5 1 6 8 2 4 5 10,最长递增子序列是1 2 4 5 10。
    Input
    第1行:1个数N,N为序列的长度(2 <= N <= 50000)
    第2 - N + 1行:每行1个数,对应序列的元素(-10^9 <= S[i] <= 10^9)
    Output
    输出最长递增子序列的长度。
    Input示例
    8
    5
    1
    6
    8
    2
    4
    5
    10
    Output示例
    5

    分析:

    令 Dp[i] = 长度为 i + 1 的上升子序列的中末尾元素最小值(不存在就是INF)
    则可以最开始Dp[i] 全部设置为INF。 然后由前到后逐个考虑数列元素, 对于
    每个 Num[j] , 如果 i = 0, 或者 Dp[i-1] < Num[j] 就可以用
    Dp[i] = min(Dp[i], Num[j]) 进行更新。

    实现:

    #include <bits/stdc++.h>
    
    using namespace std;
    
    typedef long long LL;
    
    const int INF = 0x7fffffff;
    const int maxn = 50000 + 131;
    
    int Dp[maxn], Num[maxn];
    
    int main() {
        int N;
        while(cin >> N) {
            for(int i = 0; i < N; ++i) cin >> Num[i];
            fill(Dp, Dp+N, INF);
            for(int i = 0; i < N; ++i) {
                *lower_bound(Dp, Dp+N, Num[i]) = Num[i];
            }
            cout << lower_bound(Dp, Dp+N, INF) - Dp << endl;
        }
    }
    
  • 相关阅读:
    超链接导航栏案例
    css中定位功能的特性
    background的使用
    数据库单表查询
    各种算法
    面向对象能做什么和特性及嵌套
    c3算法详解
    面向对象继承
    生成器
    迭代器
  • 原文地址:https://www.cnblogs.com/aoxuets/p/5506834.html
Copyright © 2011-2022 走看看