ダイナミックプログラミングは、問題解決の指針です。
1.例
- トライアングルは、
上から下への最小パス和を見つけ、三角形を考えます。各ステップは、あなたの下の行に隣接する番号に移動することができます。
例えば、次の三角形所与
[
[ 2 ]、
[ 3、4]、
[6]、[ 5 ]、[7]、
[4]、[ 1、8,3]
上から下への最小経路合計が11(すなわち、2を+ 3 + 5 = 11 + 1)。
注:
ボーナスポイントあなたは、nは三角形内の行の合計数があるだけでO(n)の余分なスペースを使用して、これを実行することができれば。
2.分析
1.被験者によると、深さ優先探索方法を用いることができます。
分割統治トラバーサル:深さ優先探索、同様のバイナリツリーの再帰的なアルゴリズムは、2つの戦略があります。
- 変更する、トラバースを横断値をとる(ここで和)、転送中に再帰関数のパラメータとして使用DFS。
ここで定義されたDFSをパラメータとして電流変化が(x、y)にダウンポイントとしてこの合計、この点和に来て、そして従ってDFSとの和です。
// traverse
void dfs(int x, int y, int sum) {
if (x == n) {
if (sum < best) {
best = sum;
}
return;
}
// 每次往下走有两个选择
dfs(x + 1, y, sum + a[x][y]); // 向正下方走
dfs(x + 1, y + 1, sum + a[x][y]); // 向右下方走
}
dfs(0,0);