九章演算法筆記D1 動態規劃概述

2021-10-08 02:49:52 字數 3123 閱讀 3694

tags:

大家覺得寫還可以,可以點讚、收藏、關注一下吧!

也可以到我的個人部落格參觀一下,估計近幾年都會一直更新!和我做個朋友吧!

計數型-機械人

存在型-青蛙跳石子

機械人2(座標型)

leetcode256-粉刷房子(序列型)

decode ways

確定狀態

確定轉移方程

初始條件和邊界情況

計算順序

你有三種硬幣,分別面值2元,5元和7元,每種硬幣都有足夠多,買一本書需要27元,如何用最少的硬幣組合正好付清,不需要對方找錢

//	a:  m:27

public

intcoinchange

(int

a,int m)

for(j=

0;j}}}if

(f[m]

==integer.max_value)

return f[m]

;}

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

public

intuniquepaths

(int m,

int n)

}}

有n塊石頭分別在x軸的0,1,。。。,n-1位置.乙隻青蛙在石頭0,像跳到石頭n-1。如果青蛙在第i塊石頭上,他最多可以向右跳距離ai。問青蛙能否跳到石頭n-1

input:a=[2,3,1,1,4]

output:true

input:a=[3,2,1,0,4]

output:false

public

boolean

canjump

(int

a)}}

return f[n-1]

;}

乙個機械人位於乙個 m x n 網格的左上角 (起始點在下圖中標記為「start」 )。機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角(在下圖中標記為「finish」)。現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?

public

intuniquepathswithobstacles

(int

a)int n = a[0]

.length;

if(n==0)

int[

] f =

newint

[m][n]

;int i,j;

for(i=

0;i)//top-left

if(i==

0&&j==0)

f[i]

[j]=0;

//若不為第一行

if(i>0)

//若不為第一列

if(j>0)

//若兩個條件都成立,則為f[i][j]=f[i-1][j]+f[i][j-1];}}

return f[m-1]

[n-1];

}

假如有一排房子,共 n 個,每個房子可以被粉刷成紅色、藍色或者綠色這三種顏色中的一種,你需要粉刷所有的房子並且使其相鄰的兩個房子顏色不能相同。

當然,因為市場上不同顏色油漆的**不同,所以房子粉刷成不同顏色的花費成本也是不同的。每個房子粉刷成不同顏色的花費是以乙個 n x 3 的矩陣來表示的。

例如,costs[0][0]表示第 0 號房子粉刷成紅色的成本花費;costs[1][2]表示第 1 號房子粉刷成綠色的花費,以此類推。請你計算出粉刷完所有房子最少的花費成本。

所有花費均為正整數。

輸入: [[17,2,17],[16,16,5],[14,3,19]]

輸出: 10

解釋: 將 0 號房子粉刷成藍色,1 號房子粉刷成綠色,2 號房子粉刷成藍色。

最少花費: 2 + 5 + 3 = 10。

確定狀態:

**子問題:**設油漆前i棟房子並且房子i-1是紅色、藍色、綠色的最小花費分別為f[i][0]、f[i][1]、f[i][2]

轉移方程:

public

intmincost

(int

c)//sequence type dp

int[

] f =

newint

[n+1][

3]; f[0]

[0]+f[0]

[1]+f[0]

[2]=

0;int i,j,k;

for(i=

1;i<=n;i++)}

}return math.

min(f[n][0

],math.

min(f[n][1

],f[n][2

]));

}}

有一段由a-z組成的字母串資訊被加密成數字串,加密方式為:a->1,b->2,… ,z->26,給定加密後的數字串s[0…n-1],問有多少種方式解密成字母串

input

12output

2(ab or l)

狀態:設數字串s前i個數字解密成字母串有f[i]種方式

轉移方程:設數字串s前i個數字解密成字母串有f[i]種方式

f[i] = f[i-1]|s[i-1]對應乙個字母 + f[i-2]|s[i-2]s[i-1]對應乙個字母

public

intnumdecodings

(string ss)

//check whether i>1

if(i>1)

}}return f[n]

;}

2023年7月9日更

大家覺得寫還可以,可以點讚、收藏、關注一下吧!

也可以到我的個人部落格參觀一下,估計近幾年都會一直更新!和我做個朋友吧!

動態規劃 九章演算法

最近看了九章演算法的動態規劃班,受益匪淺,一點簡要的筆記分享給大家 什麼是動態規劃?簡而言之,就是計算並儲存小問題的解,並將這些解組合成大問題的解。動態規劃題目的特點 1 計數 1 有多少種方式走到右下角 2 有多少種方法選出k個數使得和為sum 2 求最大值最小值 1 從左上角到右下角路徑的最大數...

演算法筆記 動態規劃1

動態規劃適合求解最優問題,比如最大值最小值等。它可以顯著的降低時間複雜度,提高 的執行效率。0 1 揹包問題 在上篇總結中,用回溯演算法解決了 0 1揹包問題。但是,在求解的過程中,我們應該能想象的出,有些步驟是一直在重複執行。如果揹包的總載重為 9 物品個數為 5 質量分別為 2,2,4,6,3 ...

演算法筆記 動態規劃 1

求解方法 標準的01揹包問題是指,有n int型 個物品和最多裝重量w int型 的揹包。weight陣列表示物品的重量,即weight i 表示第i個物品的重量 value陣列表示物品的價值,即value i 表示第i個物品的價值。問把哪些物品裝入揹包使得物品價值總和最大,每個物品只能裝一次。舉例...