c 動態規劃筆記

2021-10-09 22:05:00 字數 1893 閱讀 7885

7

3 88 1 0

2 7 4 4

4 5 2 6 5

7->3->8->7->5=30

定義狀態f[i][j]表示從(1,1)出發走到(i,j)所有路徑的最大和

要注意狀態轉移的順序

f[i][j]=max(f[i-1][j],f[i-1][j-1])

int

main()

,,,,

};int dp[5]

[5]=

; dp[0]

[0]=a[0]

[0];

for(

int i=

1;i<

5;i++)}

}printf

("%d",*

max_element

(dp[4]

,dp[4]

+5))

;return0;

}

1 13 5 7 8 2 11

51 5 7 8 11

狀態:用dp[i]表示以i結尾的上公升子串行的最長長度

dp[i]=max(dp[i],dp[j]+1)

int

lengthoflis

(vector<

int>

& nums)

}return

*max_element

(dp.

begin()

,dp.

end())

;}

第一步: 明確dp陣列的含義:dp[i][j] 的含義是:對於 s1[1…i] 和 s2[1…j],它們的 lcs 長度是 dp[i][j]。

第二步:定義base case

我們專門讓索引為 0 的行和列表示空串,dp[0][…] 和 dp[…][0] 都應該初始化為 0,這就是 base case。

第三步:找狀態轉移方程

(1)if text1[i] == text2[j]: dp[i][j] = dp[i-1][j-1] + 1 .

(2)elif dp[i-1][j] > dp[i][j-1] : dp[i][j] = dp[i-1][j]

(3)else: dp[i][j] = dp[i][j-1]

int

longestcommonsubsequence

(string text1, string text2)

for(

int i=

0;i<=n;i++

)for

(int i=

1;i<=m;i++

)else

if(dp[i-1]

[j]>dp[i]

[j-1])

dp[i]

[j]=dp[i-1]

[j];

else

dp[i]

[j]=dp[i]

[j-1];

}}return max;

}

4.最大子序和

輸入: [-2,1,-3,4,-1,2,1,-5,4]

輸出: 6

解釋: 連續子陣列 [4,-1,2,1] 的和最大,為 6。

int

maxsubarray

(vector<

int>

& nums)

return

*max_element

(dp.

begin()

,dp.

end())

;}

動態規劃筆記

動態規劃,維基上面的解釋是 動態規劃 英語 dynamic programming,dp 1 是一種在數學 電腦科學和經濟學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。動態規劃常常適用於有重疊子問題 2 和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。動態規...

動態規劃(C )

動態規劃問題,大致可以分為兩類 一是最優解問題,其目的是求某個問題的最小值或最大值。如 10000以內的k好數中任選三個的和,最大值為多少。二是組合問題,其目的是求某個事情發生的概率。如 長度為x的數字字串,可以分解為4個小於255的數字,可以有多少種組合方式。面對這兩種問題的解決方案也有兩種 自上...

ACM 動態規劃筆記

2.解決動態規劃問題,要先找出動態轉移方程來,動態轉移方程怎麼找呢?首先得定好,用哪幾個因子,可以明確的表示好乙個狀態,然後,再通過樣例或者特例或者硬想,找出子問題和父問題的關係,或者說,子問題怎麼push,可以影響到父問題?我感覺可以放開思路想,放心大膽的想,假設你不會動態規劃,讓你暴力搜尋,你會...