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;
    }
}
原文地址:https://www.cnblogs.com/aoxuets/p/5506834.html