動態規劃 第3講 子串行問題

2021-10-08 18:36:48 字數 1784 閱讀 5516

最近在複習期末考試,又有點懶,更新部落格的效率也下降了。

話不多說,我們來刷一遍子串行問題,用動態規劃的方法。

一、300. 最長上公升子串行 (難易程度:medium)

原題鏈結:

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度。

示例:輸入: [10,9,2,5,3,7,101,18]

輸出: 4

解釋: 最長的上公升子串行是 [2,3,7,101],它的長度是 4。

說明:可能會有多種最長上公升子串行的組合,你只需要輸出對應的長度即可。

你演算法的時間複雜度應該為 o(n2) 。

高階: 你能將演算法的時間複雜度降低到 o(n log n) 嗎?

解題思路:

對於子串行問題,動態規劃方法是,定義乙個 dp 陣列,其中 dp[i] 表示以 i 結尾的子串行的性質。在處理好每個位置後,統計一遍各個位置的結果即可得到題目要求的結果。

dp[i] 可以表示以 i 結尾的、最長子序列長度。對於每乙個位置 i,如果其之前的某個位置 j 所對應的數字小於位置 i 所對應的數字,則我們可以獲得乙個以 i 結尾的、長度為 dp[j]+ 1 的子串行。為了遍歷所有情況,我們需要 i 和 j 進行兩層迴圈,其時間複雜度為 o(n 2 )。

後面都可以按照這個模板來做。

好,來看一下**:

class

solution

} ans=

max(ans, dp[i]);

}return ans;}}

;

二、1143. 最長公共子串行(難易程度:medium)

原題鏈結:

給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行的長度。

乙個字串的 子串行 是指這樣乙個新的字串:它是由原字串在不改變字元的相對順序的情況下刪除某些字元(也可以不刪除任何字元)後組成的新字串。

例如,「ace」 是 「abcde」 的子串行,但 「aec」 不是 「abcde」 的子串行。兩個字串的「公共子串行」是這兩個字串所共同擁有的子串行。

若這兩個字串沒有公共子串行,則返回 0。

示例 1:

輸入:text1 = 「abcde」, text2 = 「ace」

輸出:3

解釋:最長公共子串行是 「ace」,它的長度為 3。

示例 2:

輸入:text1 = 「abc」, text2 = 「abc」

輸出:3

解釋:最長公共子串行是 「abc」,它的長度為 3。

示例 3:

輸入:text1 = 「abc」, text2 = 「def」

輸出:0

解釋:兩個字串沒有公共子串行,返回 0。

解題思路:

和上面一樣,只不過要注意處理邊界(第0行、第0列)的情況。

**如下:

class

solution

else dp[i][0

]=dp[i-1]

[0];

}for

(int j=

1; j)else dp[0]

[j]=dp[0]

[j-1];

}for

(int i=

1; i)else

ans=

max(ans, dp[i]

[j]);}

}return ans;}}

;

未完待續,明天更新…

動態規劃3 最長公共子串行問題

一些概念 1 子串行 乙個序列a a1,a2,an,中任意刪除若干項,剩餘的序列叫做a的乙個子串行。也可以認為是從序列a按原順序保留任意若干項得到的序列。例如 對序列 1,3,5,4,2,6,8,7來說,序列3,4,8,7 是它的乙個子串行。對於乙個長度為n的序列,它一共有2 n 個子序列,有 2 ...

動態規劃 最常公共子串行問題

前面一篇博文動態規劃 矩陣連乘問題,學習了什麼是動態規劃,以及什麼時候該用動態規劃,總得來說就是 當乙個問題可以被分成若干個子問題求解,且子問題可以優化子結構,存在子問題重複的時候,就可以使用動態子結構。最長公共子串行的定義 設 兩個序列分別為 x y 他們的最長公共子串行為 z 那麼就存在下面這幾...

動態規劃 公共子串行

公共子串行 總時間限制 1000ms 記憶體限制 65536kb 描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在 嚴格上公升 的序列 i1,i2,ik 使得對j 1,2,k,有xij zj。比如z a,b,f,c 是x a,b,c,f,b,c 的子串行。現在給...