子串行問題本來就比子串和子陣列要難,因為子串行是不連續的,窮舉困難,而且子串行一般涉及兩個字串,一般來說都是讓求乙個最長子序列,涉及子串行和最值,那一定是動態規劃,o(n2)
1.定義dp陣列有兩種思路,第一種是乙個一維的dp陣列,兩次for迴圈來解決,dp[i]的含義是在array陣列中,以array[i]為結尾的目標子串行長度為dp[i] 適合找最長遞增子串行,因為這樣符合歸納法,容易找到狀態關係
2.第二種是乙個二維的dp陣列,當涉及兩個字串時(如最長公共子串行),子串行的長度為dp[i][j],一般用兩個指標一直往前走
只涉及乙個字串時,則是在array中i到j的位置中我們要求的長度為dp[i][j],這種一般涉及的是回文。
求乙個陣列的最長遞增子串行的長度,則是乙個陣列,且不是回文,一般用到的是第一種方法,設計乙個dp[i],那怎麼從dp[i-1]得到dp[i]呢,定義的是dp[i]必須是以i這個位置數字結束的最長子序列的長度,則開頭以哪個數結束並不確定,以前面的哪個數字作為上個最後乙個數字都可以,所以在其中遍歷一次,如果此時的num[i]>num[j]則他變成1,如果num[i]>num[i-1],則可以等於dp[j]+1,
則最終結果是dp陣列的最大值,初始化為1,因為最小長度也為1.
class
solution
for(
int i=
0;ires=math.
max(dp[i]
,res);}
return res;
}}
最長公共子串行 最長遞增子串行
最長公共子串行 dp 杭電1159 include using namespace std string str1,str2 int dp 1005 1005 intlcs return dp str1.size str2.size int main 最長遞增子串行 杭電1257 include u...
最長公共子串行 最長遞增子串行 最長遞增公共子串行
求最長公共子串行 int dp maxn maxn int a maxn b maxn int main else dp i j max dp i 1 j dp i j 1 printf d n dp m n return 0 輸出最長公共子串行 int dp maxn maxn int d max...
最長遞增子串行
這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度o nlgn 空間複雜度o n 這題明顯用動態規劃來解。假設在目標陣列array 的前i個元素中,以array i 元素為最大元素的遞增子串行的長度是lis i 那麼 遞...