這是典型的三道動態規劃,在筆試當中,有可能會被舉一反三地考。
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 ...