<データ構造とアルゴリズム> - 動的計画入門(1)

ダイナミックプログラミングは、問題解決の指針です。

1.例

  1. トライアングルは、
    上から下への最小パス和を見つけ、三角形を考えます。各ステップは、あなたの下の行に隣接する番号に移動することができます。
    例えば、次の三角形所与
    [
    [ 2 ]、
    [ 3、4]、
    [6]、[ 5 ]、[7]、
    [4]、[ 1、8,3]
    上から下への最小経路合計が11(すなわち、2を+ 3 + 5 = 11 + 1)。

    ボーナスポイントあなたは、nは三角形内の行の合計数があるだけでO(n)の余分なスペースを使用して、これを実行することができれば。

2.分析

1.被験者によると、深さ優先探索方法を用いることができます。

分割統治トラバーサル:深さ優先探索、同様のバイナリツリーの再帰的なアルゴリズムは、2つの戦略があります。

  1. 変更する、トラバースを横断値をとる(ここで和)、転送中に再帰関数のパラメータとして使用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);

おすすめ

転載: www.cnblogs.com/isguoqiang/p/11482132.html