演算法 九 動態規劃

2021-10-19 17:32:00 字數 3391 閱讀 5840

總結:動態規劃,一般來說,首先弄明白暴力遞迴怎麼做(嘗試),然後再優化(避免重複計算),把暴力遞迴的過程抽象成狀態表達。

漢諾塔

/**

* * 漢諾塔問題

* 列印n層漢諾塔從最左邊移動到最右邊的全部過程

* */

public

class

code_02_hanoi

}public

static

void

func

(int rest,

int down, string from, string help, string to)

else

}public

static

void

main

(string[

] args)

}

列印乙個字串的全部子串行(注意與子串區別),包括空字串

public

class

code_03_print_all_subsquences

printallsubsequence

(str, i-

1, res)

;printallsubsequence

(str, i-

1, res + string.

valueof

(str[i]))

;}public

static

void

main

(string[

] args)

}

小母牛

/**

* * 母牛每年生乙隻母牛,新出生的母牛成長三年後也能每年生乙隻

* 母牛,假設不會死。求n年後,母牛的數量。

* fn=f(n-1)+f(n-3)

* * 如果每只母牛只能活10年,求n年後,母牛的數量

* */

public

class

code_05_cow

if(n ==

1|| n ==

2|| n ==3)

return

cownumber1

(n -1)

+cownumber1

(n -3)

;}public

static

intcownumber2

(int n)

if(n ==

1|| n ==

2|| n ==3)

int res =3;

int pre =2;

int prepre =1;

int tmp1 =0;

int tmp2 =0;

for(

int i =

4; i <= n; i++

)return res;

}public

static

void

main

(string[

] args)

}

二維陣列,返回最小的路徑和

/**

* * 給你乙個二維陣列,二維陣列中的每個數都是正數,要求從左上

* 角走到右下角,每一步只能向右或者向下。沿途經過的數字要累

* 加起來。返回最小的路徑和。

* */

public

class

code_07_minpath

// 暴力遞迴,解題效率較低

public

static

intprocess1

(int

matrix,

int i,

int j)

if(i ==

0&& j !=0)

if(i !=

0&& j ==0)

return res + math.

min(

process1

(matrix, i, j -1)

,process1

(matrix, i -

1, j));

}// 動態規劃,dp陣列,解題效率高

public

static

intminpath2

(int

m)int row = m.length;

int col = m[0]

.length;

int[

] dp =

newint

[row]

[col]

; dp[0]

[0]= m[0]

[0];

for(

int i =

1; i < row; i++

)for

(int j =

1; j < col; j++

)for

(int i =

1; i < row; i++)}

return dp[row -1]

[col -1]

;}// for test

public

static

int[

]generaterandommatrix

(int rowsize,

int colsize)

int[

] result =

newint

[rowsize]

[colsize]

;for

(int i =

0; i != result.length; i++)}

return result;

}public

static

void

main

(string[

] args),,

,}; system.out.

println

(minpath1

(m))

; system.out.

println

(minpath2

(m))

; m =

generaterandommatrix(6

,7);

system.out.

println

(minpath1

(m))

; system.out.

println

(minpath2

(m));}

}

動態規劃 九章演算法

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

面試初入演算法(九) 動態規劃

將乙個複雜的問題拆分為重複的子問題,確保每乙個問題都是最優解,從而得出全域性最優解,用遞迴的方式,常用的動態規劃會要求求最大值,最少的方法等。分治 遞迴 動態規劃 貪心演算法區別 看部落格 動態規劃的關鍵點 最優子結構 儲存中間狀態 得出dp公式 現在以乙個簡單的題進入,從而了解什麼是動態規劃 斐波...

乾貨 動態規劃九問九答

答 動態規劃是一種通過 大而化小 的思路解決問題的演算法。區別於一些固定形式的演算法,如二分法,寬度優先搜尋法,動態規劃沒有實際的步驟來規定第一步做什麼第二步做什麼。所以更加確切的說,動態規劃是一種解決問題的思想。這種思想的本質是,乙個規模比較大的問題 假如用2 3個引數可以表示 是通過規模比較小的...