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,可以影響到父問題?我感覺可以放開思路想,放心大膽的想,假設你不會動態規劃,讓你暴力搜尋,你會...