DP1 動態規劃概述

2022-08-23 12:15:11 字數 2856 閱讀 3646

計數求最大值最小值

求存在性

確定狀態

簡單的說,就是解動態規劃時需要開乙個陣列,陣列的每個元素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

\]

public int coinchange(int a,int m)}}

if(f[m]==integer.max_value)

return -1;

else

return f[m];

}

題目:給定m行n列的網格,有乙個機械人從左上角(0,0)出發,每一步可以向下或者向右走一步,問有多少種不同的方式走到右下角。

確定狀態

最後一步:聚焦機械人最後挪動的一歩,右下角座標為(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 ...