最長遞增子串行:找到給定序列的最長子序列的長度,使得子串行所有元素單調遞增。
最長公共子串行求法的時間複雜度: θ(nlgn
)+θ(
n2)=
θ(n2
) θ(n
lgn)
+θ(n
2)=θ
(n2)
與第乙個辦法不同的是,動態規劃是直接在原問題上採用動態規劃最優子結構:
對於長度為n的陣列a[
n]= a[n
]=,假設我們想要以aiai
結尾的最大遞增子串行長度,設長度l[i]l
[i],那麼 l[i
]=a
=,則:
具體打表方式如下:
//lis 的動態規劃方式實現
include using namespace std;
int getlislength(int a, int
len)
本解法的具體操作如下:遍歷結束之後,最長遞增序列長度即為棧的大小。注意c陣列的下標代表的是子串行的長度,c陣列中的值也是按遞增順序排列的。這才可能用二分查詢。
int getlislength(int num, int length)
ivec[low] = num[i];
} }
return ivec.size();
特別注意的是:本方法只能用於求最長遞增子串行的長度,輔助陣列中的序列不是最長遞增子串行:
問題描述:計算最少出列多少位同學,使得剩下的同學排成合唱隊形
問題說明:
n n
位同學站成一排,**老師要請其中的(n
−k)' role="presentation">(n−
k)(n
−k)位同學出列,使得剩下的k位同學排成合唱隊形。
合唱隊形是指這樣的一種隊形:設
k k
位同學從左到右依次編號為1,
2…,k
,' role="presentation">1,2
…,k,
1,2…
,k,他們的身高分別為t1
,t2,
…,tk
, t1,
t2,…
,tk,
則他們的身高滿足存在i(
1<=
i<=k)i(
1<=
i<=k)
使得t1
<..>
....
−1>ti
+1>..
....
>tkt1
<..>
....
−1>ti
+1>..
....
>tk
。 任務是:
已知所有n位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。
輸入: 整數n
n,一行整數,空格隔開,
n' role="presentation">n
n位同學身高
輸出:
最少需要幾位同學出列
樣例輸入:
186 186 150 200 160 130 197 200樣例輸出:8
根據題意可知,我們需要求出乙個「中間點」,使得其左邊的【最長遞增子串行】和其右邊的【最長遞減子串行】之和最大。4
```
#include
#include
using
namespace
std;
int longgestincreaselength(vector
&vec)
}
for (int i = vec.size() - 2; i >= 0; --i)
}
int max = 0;
for (int i = 0; i < vec.size(); i++)
return vec.size() - max + 1;
}
int main()
最長遞增子串行
這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度o nlgn 空間複雜度o n 這題明顯用動態規劃來解。假設在目標陣列array 的前i個元素中,以array i 元素為最大元素的遞增子串行的長度是lis i 那麼 遞...
最長遞增子串行
最長遞增子串行又叫做最長上公升子串行 子串行,正如lcs一樣,元素不一定要求連續。本節討論實現三種常見方法,主要是練手。題 求乙個一維陣列arr i 中的最長遞增子串行的長度,如在序列1,1,2,3,4,5,6,7中,最長遞增子串行長度為4,可以是1,2,4,6,也可以是 1,2,4,6。方法一 d...
最長遞增子串行
最長遞增子串行 求乙個字串的最長遞增子串行 如 dabdbf最長遞增子串行就是abdf,長度為4 這是一道基本的動態規劃求解的題目,與此類似的還有 最長公共子串行 分析 用一維陣列dp i 來儲存以a i 為末元素的最長遞增子串行的長度,那麼dp i 至少為1 即包含它本身 往前尋找,如果存在a j...