【動的プログラミングの学習】さまざまな道 (5)

目次

動的プログラミングを学ぶにはどうすればよいですか?

1. トピック分析

2. アルゴリズム原理

1. ステータス表現

2. 状態遷移方程式

3. 初期化

4.注文の実行

5. 戻り値

3. コードの書き方

最後に次のように書きます。


動的プログラミングを学ぶにはどうすればよいですか?

動的プログラミングの学習はもちろん、アルゴリズムの学習にも近道はありません。

動的プログラミング アルゴリズムに関する質問を私と一緒に解決し、動的プログラミングを一緒に学びましょう!

1. トピック分析

トピックリンク: 62. 異なるパス - Leetcode

 トピックの要件も理解しやすいです。

ロボットは右か下にしか進めないので、

最初から最後までに状況が何回あるかを求めます。

2. アルゴリズム原理

1. ステータス表現

それでは、 dp[ i ][ j ] は何を表すのでしょうか?

dp[ i ][ j ] は、[ i, j ] の位置に到達する方法が何通りあるかを意味します。

2. 状態遷移方程式

ロボットは右と下にしか移動しないので、最新のステップに従って問題を分割します。

dp[ i ][ j ] は、上からのメソッドの数 + 左からのメソッドの数に等しくなります。

したがって、 dp[ i ][ j ] = dp[ i - 1 ][ j ] + dp[ i ][ j - 1 ]

3. 初期化

1行1列の上下に数字がないので、

したがって、最初の行と最初の列のメソッドの数は 1 なので、それを直接 1 に初期化します。

次に、 dp[ 1 ][ 1 ] からトラバースします。

4.注文の実行

左から右へ、上から下へ直接。

5. 戻り値

タイトルで必要な終了位置を返すだけです: dp[ m - 1 ][ n - 1 ]。

3. コードの書き方

class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m, vector<int>(n, 1));
        for(int i = 1; i < m; i++) {
            for(int j = 1; j < n; j++) {
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[m - 1][n - 1];
    }
};

最後に次のように書きます。

以上が今回の記事の内容となります、読んでいただきありがとうございます。

何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。

記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜

おすすめ

転載: blog.csdn.net/Locky136/article/details/131568518