【POJ - 2533】Longest Ordered Subsequence (最長上升子序列 簡單dp)

Longest Ordered Subsequenceios

搬中文數組

Descriptions:函數

給出一個序列,求出這個序列的最長上升子序列。spa

序列A的上升子序列B定義以下:.net

  1. B爲A的子序列
  2. B爲嚴格遞增序列

Inputcode

第一行包含一個整數n,表示給出序列的元素個數。blog

第二行包含n個整數,表明這個序列。
1 <= N <= 1000

Outputip

輸出給出序列的最長子序列的長度。ci

Sample Inputget

7
1 7 3 5 9 4 8

Sample Output

4

題目連接:

https://vjudge.net/problem/POJ-2533

 

就是最長子序列,沒啥說的,簡單dp

二分查找的函數有 3 個:
lower_bound(起始地址,結束地址,要查找的數值) 地址:前閉後開。返回的是第一個大於或等於數值出現的位置,若是數值大於數組中所有元素,返回的是結束地址。
upper_bound(起始地址,結束地址,要查找的數值) 地址:前閉後開。返回的是第一個大於數值出現的位置,若是數值大於數組中所有元素,返回的是結束地址。
binary_search(起始地址,結束地址,要查找的數值) 返回的是是否存在這麼一個數,是一個bool值。

 

AC代碼

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define Mod 1000000007
#define eps 1e-6
#define ll long long
#define INF 0x3f3f3f3f
#define MEM(x, y) memset(x, y, sizeof(x))
#define Maxn 1000+10
using namespace std;
int dp[Maxn];
int a[Maxn];
int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int len=1;//最長子序列長度
    dp[1]=a[1];
    for(int i=2;i<=n;i++)
    {
        if(a[i]>dp[len])//大於前一個,則賦值
            dp[++len]=a[i];
        else
        {
            //小於,則找到第一個大於a[i]的值,並把它替代了
            int t=lower_bound(dp+1,dp+len,a[i])-dp;
            dp[t]=a[i];
        }
    }
    cout<<len<<endl;
    return 0;
}
相關文章
相關標籤/搜索