51node 1134 最長遞增子序列 (數據結構)
阿新 • • 發佈:2018-10-11
賦值 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 最長遞增子序列 (數據結構)