1. 程式人生 > >51node 1134 最長遞增子序列 (數據結構)

51node 1134 最長遞增子序列 (數據結構)

賦值 log 寫法 數字 name 內存 遞增 max scan

題意:

最長遞增子序列

思路:

普通的$O(n^2)$的會超時。。

然後在網上找到了另一種不是dp的寫法,膜拜一下,自己寫了一下解釋

來自:https://blog.csdn.net/Adusts/article/details/80764782

代碼:

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
    int n = 0, buf = 0, max = 0;
    scanf("%d", &n);
    vector<int>a;
    vector<int>::iterator it;//叠代器,像指針一樣的東西 
    while(n--) {
        scanf("%d", &buf);
        if((it = upper_bound(a.begin(), a.end(), buf)) == a.end()) {
        //upper_bound返回第一個大於buf的數字的位置,這裏判斷新數字buf是不是比vector中所有的值大 
            a.push_back(buf);//如果是最大值,push進去 
            max++;//結果加1 
        } else {
            *it = buf;//這個的意思是很重要
            //在上面用過一次it,返回的值一直保存在it中,現在*it是一個指針,可以改變當前內存中的值
            //重新賦值為buf,覆蓋原來的值
            //為什麽這麽做呢,例如輸入5個數字,5,6,1,2,3,很明顯答案是3,5和6都去掉 
            //if很好理解,碰到大數就加到vector中,第一次觸發else是輸入1的時候,it指向5,把5替換為1,下一次觸發把6替換為2,然後push(3)
            //每次替換一個不會影響結果 
        }
    }
    printf("%d\n", max);
    return 0;
}

51node 1134 最長遞增子序列 (數據結構)