動態規劃幾個典型題總結

2021-07-22 15:38:35 字數 1697 閱讀 2637

這是典型的三道動態規劃,在筆試當中,有可能會被舉一反三地考。

1、求乙個陣列最大連續子陣列之和。

示例:int nums = ;  最大連續子陣列是2,1,3,6,所以輸出12。

2、求乙個陣列的最長遞增子串行。

示例:int nums = ;    最長遞增子串行是1,3,6,所以輸出3。

3、求兩個字串的最大公共子串。

示例:string str1 = "bcfde";      string str2 = "abcef";    輸出bc。

4、求兩個字串的最大公共子串行的個數。

示例:string str1 = "bcfde";      string str2 = "abcef";    最大公共子串行是bcf,輸出3。

第乙個問題:

最經典!連續,和最大。這兩個重點,用兩個變數標記,乙個是localmax = math.max(nums[i], nums[i]+localmax); 什麼意思呢?當前值nums[i]與nums[i]+localmax取大,比如,上一步算出的localmax為-10,現在nums[i] = 5,很明顯,就選擇5作為localmax,前面所有的數將不再最終候選子陣列中。另乙個是max = math.max(max, localmax),這很明顯了,你算出來了localmax,自然要和上一步計算出的max作比較,取大值。

第二個問題:

問題稍複雜。dp[i]表示以下標i結尾的子陣列中最長遞增子串行的長度,狀態轉移 方程為:dp[i] = math.max(dp[j]+1, dp[i]),這裡的j為1<=j第三個問題:

序貫決策,高大上!用乙個二維矩陣記錄結果。舉例子來說

需要記錄的是,max = 2, maxindex = 1; 返回的是str1.substring(maxindex+1-max, maxindex+1);

第三個問題:

在上乙個問題基礎上有了拓展,不需要連續,只要有相同即可,同樣用二維矩陣記錄結果,

最後輸出3即可。

**:

public class test ;

system.out.println("乙個陣列的最長遞增子串行:"+getlis(nums));

system.out.println("乙個陣列的最大連續子陣列之和:"+getmaxsubarr(nums));

} /**

* 乙個陣列的最長遞增子串行

* @param nums

* @return

*/public static int getlis(int nums)else }

/*** 乙個陣列最大連續子陣列之和

典型的動態規劃

一 問題描述 給定陣列arr,arr中所有值都為整數且不重複,每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意長,再給定乙個整數aim代表要找的錢數,求換錢有多少種方法 二 暴力解法 index代表的是哪種錢 i代表的是有多少張這樣的錢 對i和index分別遍歷,剩下的錢再用process1來分...

動態規劃典型例題

題目描述 一天,ykc在學校閒的無聊,於是決定上街買點吃的,ykc很懶,本來就不是很像逛街,於是找來了czl幫他買,這裡應該有滑稽,而czl也不願為ykc買東西吃,但是ykc很強勢,非讓他去買,呢沒辦法了,然而czl還有很多事要做,沒呢麼多時間幫ykc,而這條小吃街又很長,有n家店,n有50000這...

LeetCode 動態規劃題總結

64 最小路徑和 思路 dp 陣列為二維陣列,長度取決於提供陣列 陣列需初始化橫起始軸的值和豎起始軸的值,中間的值取決於上,左的值。關鍵在於了解本值與上,左值的關係 class solution int m grid.length int n grid 0 length int dp newint ...