總結:動態規劃,一般來說,首先弄明白暴力遞迴怎麼做(嘗試),然後再優化(避免重複計算),把暴力遞迴的過程抽象成狀態表達。
漢諾塔
/**
* * 漢諾塔問題
* 列印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個引數可以表示 是通過規模比較小的...