通過最近對於一些演算法題的思考,越來越發現動態規劃方法的在時間上高效性,往往該問題可以輕鬆的找到暴力破解的方法,其時間複雜度卻不盡人意。下面來看看幾個常見的動態規劃思路的經典問題f(
n):表
示n階樓
梯有多少
種走法f
(n)=
f(n−
1)+f
(n−2
)f(1
)=1,
f(2)
=2例二:01揹包問題
有n個重量和價值分別為vector weight, vector value的物品;揹包最大負重為w,求能用揹包裝下的物品的最大價值?
輸入:n =4
weight=2, 1, 3, 2
value =3, 2, 4, 2
w=5
輸出=7 dp
[i][
j]表示
前i號物
品中能選
出重量在
j之內的
最大價值
dp[i
][j]
=max
(dp[
i−1]
[j],
dp[i
−1][
j−w[
i]]+
v[i]
);例三:最大連續子串行和
如給定陣列[-2,1,-3,4,-1,2,1,-5,4]
連續的子陣列為[4,-1,2,1]有最大和6 f(
j+1)
為以下標
j結尾的
連續子序
列和的最
大值f(
j+1)
=max
(f(j
)+a[
j],a
[j])
targ
et=m
axf[
j]思考:最大連續子串行乘積
如給定陣列[-2,1,-3,4,-1,2,1,-5,4]
連續的子陣列為[4,-1,2,1]有最大和6 f(
j+1)
為以下標
j結尾的
連續子序
列最大乘
積值(1
)狀態轉移方程如何表示呢:
這裡我們知道a[j]可能為正數(或0)或負數,那麼當a[j]為正數,期望前j個乘積為正數,若為負數,則期望前面的為負數。故我們需定義兩個函式來確定我們的狀態轉移方程: fm
ax(j
+1)=
max(
max(
fmax
(j)∗
a[j]
,a[j
]),f
min(
j)∗a
[j])
fmin
(j+1
)=mi
n(mi
n(fm
in(j
)∗a[
j],a
[j])
,fma
x(j)
∗a[j
])(2
)1.通過以上動態問題問題的分析,可以看出最重要的是定義好相應的問題,然後寫出狀態轉移方程,往往這也是整個問題求解最能考察你分析能力的過程。能夠用動態規劃求解的問題有兩類性質:
a.重疊子問題
採用遞推方式,比如上例要求出10階樓梯走法,那麼最後一步是踏一步上來或者踏2步上來,最後轉化為相應的子問題,子問題深入求解就包含了重疊的子問題,所以自頂向下的實現並不高效,常採用備忘錄方式儲存子問題的最優解,自底向上更高效。
b.最優子結構:
往往子問題的最優解可以推出原問題的最優解
動態規劃深入理解
能用動規解決的問題的特點 1 問題具有最優子結構性質。如果問題的最優解所包含的 子問題的解也是最優的,我們就稱該問題具有最優子結 構性質。2 重疊子問題 3 無後效性。當前的若干個狀態值一旦確定,則此後過程的演變就只和這若干個狀態的值有關,和之前是採取哪種手段或經過哪條路徑演變到當前的這若干個狀態,...
深入理解C語言 深入理解指標
關於指標,其是c語言的重點,c語言學的好壞,其實就是指標學的好壞。其實指標並不複雜,學習指標,要正確的理解指標。指標也是一種變數,占有記憶體空間,用來儲存記憶體位址 指標就是告訴編譯器,開闢4個位元組的儲存空間 32位系統 無論是幾級指標都是一樣的 p操作記憶體 在指標宣告時,號表示所宣告的變數為指...
mysql 索引深入理解 深入理解MySql的索引
為什麼索引能提高查詢速度 先從 mysql的基本儲存結構說起 mysql的基本儲存結構是頁 記錄都存在頁裡邊 各個資料頁可以組成乙個雙向鍊錶每個資料頁中的記錄又可以組成乙個單向鍊錶 每個資料頁都會為儲存在它裡邊兒的記錄生成乙個頁目錄,在通過主鍵查詢某條記錄的時候可以在頁目錄中使用二分法快速定位到對應...