計數求最大值最小值
求存在性
確定狀態
簡單的說,就是解動態規劃時需要開乙個陣列,陣列的每個元素f[i]或者f[i][j]代表什麼,類似解數學題中,xyz代表什麼一樣,具體分為下面兩個步驟:
轉移方程
根據子問題定義直接得到
初始條件和邊界情況
初始條件一般都是a[0]、a[1]這種,多看看邊界條件主要是看陣列的邊界,陣列越不越界
計算順序
利用之前的計算結果,一般從左到右,從上到下
題目:有三種硬幣,面值2.5.7,買一本書需要27元,如何用最少的硬幣剛好付清。
確定狀態
最後一步:雖然我們不知道最優策略是什麼,但是最優策略一定是k枚硬幣\(a_1,a_2…a_k\)加起來等於27,所以一定有一枚最後的硬幣\(a_k\),除掉這枚硬幣,前面硬幣的面值相加起來是\(27-a_k\)
轉化為子問題:所以就將原問題轉化為了子問題如下
原問題是最少用多少枚硬幣拼出27(k枚)
子問題是最少用多少枚硬幣拼出\(27-a_k\)(k-1枚)
經過這兩歩,得出狀態:f[x]=最少用多少枚硬幣拼出x
轉移方程
\[f\lbrack x\rbrack=min\
\]\(f\lbrack x\rbrack\)指最少用多少枚硬幣拼出x,由於最後一步\(a_k\)有三種情況,最後一枚硬幣可能是2,5,7中的一種,所以轉移方程應該是取三種情況中能夠拼出x使用硬幣最少的那種情況
此時,可以用遞迴進行解題
遞迴是從上到下進行計算的,這樣的話會產生大量的重複運算,解決方法是採用動態規劃,將計算結果儲存下來,改變計算順序public int f(int x)
}
初始條件和邊界情況
邊界條件x-2,x-5,x-7小於0時,應該進行處理,這種情況其實就是拼不出來的情況,定義為正無窮
初始條件一般就是根據轉移方程計算不出來的值,從轉移方程變數為0或1來選,根據題目進行分析,這個題目的初始條件就是\(f\lbrack 0\rbrack=1\),代入公式的話應該f[0]為正無窮,顯然錯誤,所以自己定義\(f\lbrack 0\rbrack=1\)
計算順序,從小到大進行進行
\[f\lbrack x\rbrack=最少用多少枚硬幣拼出x
\]\[f\lbrack x\rbrack=\infty 表示無法用硬幣拼出x
\]
題目:給定m行n列的網格,有乙個機械人從左上角(0,0)出發,每一步可以向下或者向右走一步,問有多少種不同的方式走到右下角。public int coinchange(int a,int m)}}
if(f[m]==integer.max_value)
return -1;
else
return f[m];
}
確定狀態
最後一步:聚焦機械人最後挪動的一歩,右下角座標為(m-1,n-1),那麼前一步機械人一定在(m-2,n-1)或者(m-1,n-2)
子問題:可得,機械人走到(m-1,n-1)的方式等於機械人走到(m-2,n-1)加上機械人走到(m-1,n-2)
原問題是有多少種方式從左上角走到(m-1,n-1)
子問題是有多少種方式從左上角走到(m-2,n-1)和(m-1,n-2)
經過這兩歩,得出狀態:\(f\lbrack i\rbrack\lbrack j\rbrack\)為機械人有多少種方式從左上角走到(i,j)
轉移方程
\[f\lbrack i\rbrack\lbrack j\rbrack=f\lbrack i-1\rbrack\lbrack j\rbrack+f\lbrack i\rbrack\lbrack j-1\rbrack
\]初始條件和邊界情況
邊界條件:i=0或者j=0時前一步只能從乙個方向過來,所以f[i][j]=1
初始條件:f[0][0]=1,機械人只有一種方式到左上角
從上到下,從左到右
給你一根長度為public class solution
\]\(f\lbrack j\rbrack\)表示青蛙能不能跳到j位置,若在所有小於j的位置i中,至少有乙個位置能到j,則j是可以到達的
初始條件和邊界情況
邊界條件:列舉的i和j都不會越界,所以沒有邊界條件
初始條件:f[0]=true,因為青蛙一開始就在石頭0上
計算順序
從左到右計算
public class solution }}
return f[a.length-1];
}}
n
的繩子,請把繩子剪成整數長度的m
段(m、n都是整數,n>1並且m>1),每段繩子的長度記為k[0],k[1]...k[m-1]
。請問k[0]*k[1]*...*k[m-1]
可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。
確定狀態
最後一步:假設繩子剪得最後一下的長度為j,只需要滿足j子問題:相當於從1開始遍歷j,找出 j*(i-j部分的乘積最大值)的最大值
原問題是長度為i的乘積最大值
子問題是長度為i-j的乘積最大值
轉移方程
\[f\lbrack i\rbrack=max_
\]初始條件和邊界情況
f[0]=nums[0]
計算順序
從f[1]開始計算
class solution
return res;
}}
動態規劃10 數字DP1
在資訊學競賽中,有這樣一類問題 求給定區間中,滿足給定條件的某個d 進製數或 此類數的數量。所求的限定條件往往與數字有關,例如數字之和 指定數碼個數 數的大小 順序分組等等。題目給定的區間往往很大,無法採用樸素的方法求解。此時,我們就需要利用數字的性質,設計 log n 級別複雜度的演算法。解決這類...
DP1線性動態規劃 題
例4 lcs 最長公共子串行 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列。確切地說,若給定序列x 若另一串行z 是x的子串行,是指存在乙個嚴格遞增的下標序列 使得對於所有j 1,2,k有 例如,序列z 是序列x 的子串行,相應的遞增下標序列為 2,3,5,7 給定兩個序列x和y 當另一...
動態規劃 線性DP 1
動態規劃演算法通常用於求解具有某種最優性質的問題。那它和貪心有區別嗎?當然有。不然叫動態規劃幹啥?幼兒園英語老師 dp是啥?小盆友 dog peppa pig 英語老斯 恩恩!真聰明!然而,你是小盆友嗎?如果是 如果不是,dp是d p 的縮寫。意思是動態規劃。聰明的bolt告訴你 是dynamic ...