20 8 6 sort pair 求最長遞增子串行

2021-10-08 22:01:35 字數 1293 閱讀 1531

std::sort

//sort(first,last,compare);

vector<

int> s=

;//compare可以是預設(不寫)、庫函式、使用者函式、lambda表示式

sort

(s.begin()

,s.end()

,greadter<

int>()

);//遞減

sort

(s.begin()

.s.end()

,(int a,

int b));

//遞增

std::pair

pair<

int,

int> s=

;cout<對於第i個數字a[i],若以a[i]為結尾,可求出最長遞增子串行長度為

max(以前面每乙個數字作結尾的最長遞增子串行長度+1(如果a[i]可以放在那個數字後面的話))

比如對於第3個數字,它作結尾的最長遞增子串行長度為

max(0)//a[3]a[1],a[3]a[2]

max(第1個數字作結尾的長度+1,第2個陣列做結尾的長度+1)//a[3]>a[1],a[3]>a[2]

有可能超時

3.2二分查詢(o(nlogn))

該演算法不容易理解

做法:

初始化乙個空序列

把每乙個數字都插入該序列中:替換序列中第乙個大於等於該數字的位置;若序列末尾的數字仍比它小則放在末尾

序列中大於等於乙個數字的位置可以用std::lower_bound(search for first element that is not less than i)做到,這個函式使用二分查詢的方式實現

對於序列[1,2,3,4,0,1,2],七個數字插入空陣列,每一步之後陣列為

[1][1,2]

[1,2,3]

[1,2,3,4]

[0,2,3,4]

[0,1,3,4]

[0,1,2,4]

可以看到雖然最終該序列不是答案[1,2,3,4]而是[0,1,2,4],但長度4是沒有問題的,而題目僅僅要求最長遞增子串行的長度

vector<

int> a=

;vector<

int> dp;

for(

int x:a)

return dp.

size()

;

求最長等值序列

求最長等值序列 100 100 分數 題目描述 給定乙個數列a,如果其中有一段 至少含有兩個元素 序列裡面的元素都相等,則稱這段序列為等值序列。我們的任務是求最長的等值序列 輸入描述 第一行是數列的長度n,n 50 第二行是n個數字 輸出描述 輸出最長等值序列在原始數列中的起始位置和末位置,數列的起...

滑雪求最長路徑

輸入檔案 第1行 兩個數字r,c 1 r,c 100 表示矩陣的行列。第2 r 1行 每行c個數,表示這個矩陣。輸出檔案 僅一行 輸出1個整數,表示可以滑行的最大長度 樣例輸入 5 51 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 ...

求最長回文串

題目描述如下 能立刻想到的就是爆破,先試試無腦爆破,時間複雜度o n 3 然後毫無意外的超時了,爆破 如下 public string longestpalindrome string s string rtstring 從第乙個字元開始,統計以每個字元開頭的能達到的最大回文子串 for int i...