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...