動態規劃習題整理(1)

2021-10-05 18:29:05 字數 2324 閱讀 4626

狀態表示:f[i]表示以第 i 個元素結尾的所有連續子陣列的最大值。

狀態轉移:f[i] = max(f[i-1], 0) + nums[i]。f[i]可劃分為兩部分,以第 i -1個元素結尾的所有連續子陣列加上第i個元素,或者只選用第 i 個元素。答案為所有f[i]中的最大值。

優化:由於f[i] 在計算時只會用到f[i-1],則sum在第(i - 1)輪迴圈得到的結果即為f[i-1],第 i 輪迴圈使用的sum即為f[i-1]。

class

solution

return ans;}}

;

狀態表示:f[i,j]表示從頂點走到第 i 層第 j 列的所有路徑的最小值。

狀態轉移:f[i][j] = min(f[i-1][j-1], f[i-1][j] ) + nums[i][j]。f[i,j]可劃分為兩部分,從上一層左邊來f[i-1][j-1],從上一層右邊來f[i-1][j]。

優化:由於第 i 層計算只會用到第(i - 1)層,所以考慮是否可以去掉層數那一維,迭代次數即為層數。若去掉, f[j]計算完後,f[j + 1]需要上一層的f[j],但此時f[j]已是同層資料了,故不能去掉層數那一維,在當前層沒有計算完之前,資料不可被覆蓋。所以我們只需儲存兩層資料,可用滾動陣列優化。

class

solution

}long

long ans = int_max;

for(

int i =

0; i < n; i ++

) ans =

min(ans, f[n-1&

1][i])

;return ans;}}

;

狀態表示:f[i,j]表示從(0,0)走到(i,j)的所有路徑的數量。

狀態轉移:(i,j)可以是(i-1,j)向下走到達,也可以是(i,j-1)向左走到達。

class

solution

}return f[m-1]

[n-1];

}};

狀態表示:f[i]表示以第i個字母結尾的字串解碼的所有方式。

狀態轉移:f[i]可以劃分為第i個字母單獨解碼的方式和第i個字母和第i-1個字母作為兩位數解碼的方式。

class

solution

}return f[s.

size()

];}}

;

狀態表示:f[i]表示搶到第i家獲得的最大金額。

狀態轉移:f[i]可以劃分為不搶第 i 家和搶第 i 家。若不搶,則此時最大金額為f[i-1];若搶,此時最大金額為f[i-2] + nums[i]。

class

solution

return f[n-1]

;}};

狀態表示:f[i]表示所有以第 i 個數字結尾的上公升子串行的最大長度。

狀態轉移:以倒數第二個數進行劃分。只含第 i 個數,倒數第二個數是陣列第0項、第1項…第i-1項。

class

solution

int ans =0;

for(auto it : f)

ans =

max(it, ans)

;return ans;}}

;

狀態表示:f[i][j]表示s1的前 i 個字元和s2的前 j 個字元個字元構成的最長公共子串行的長度。

狀態轉移:以倒數第乙個字元進行劃分。1、若s1的第 i 個字元不在,而s2的第 j個字元在子串行中;2、若s1的第 i 個字元在,而s2的第 j 個字元不在子串行中;3、若兩者都在。(注:兩者都不在被1或2包含)

class

solution

}return f[m]

[n];}}

;

狀態表示:f[i][j]表示以( i, j )為右下角的正方形最大邊長數。

狀態轉移:以延申的最長距離為劃分依據。若( i, j )為0,則無法延伸,f[i][j]為0;向上延伸最大為 f[i-1][j],向左延伸最大為 f[i][j-1],向左上延伸最大為 f[i-1][j-1],但要保證為正方形,所以要取延伸距離的最小值。

class

solution

f[i &1]

[j]=

min(f[i &1]

[j-1],

min(f[i-1&

1][j-1

], f[i-1&

1][j]))+

1; cnt +

= f[i &1]

[j];}}

return cnt;}}

;

模板整理之動態規劃(1)

動態規劃篇 1 第一篇模板是動態規劃的樹形dp 題目為 沒有上司的舞會 詳情參考演算法競賽高階。dp注意重要陣列f,f i 0 表示不參加,f i 表示參加 include include include using namespace std const int mn 10010 int n in...

動態規劃習題

401最大連續乘積子串 402字串編輯距離 403格仔取數問題 404交替字串 1.子串行個數 子串行的定義 對於乙個序列a a 1 a 2 a n 則非空序列a a p1 a p2 a pm 為a的乙個子串行 其中1 p1 2.數塔取數問題 乙個高度為n的由正整數組成的三角形,從上走到下,求經過的...

動態規劃習題

解題思路 lis lcs 拿數問題 ii 解題思路 東東在玩遊戲 game23 在一開始他有乙個數字n,他的目標是把它轉換成m,在每一步操作中,他可以將n乘以2或乘以3,他可以進行任意次操作。輸出將n轉換成m的操作次數,如果轉換不了輸出 1。input 輸入的唯一一行包括兩個整數n和m 1 n m ...