目次
動的プログラミングを学ぶにはどうすればよいですか?
動的プログラミングの学習はもちろん、アルゴリズムの学習にも近道はありません。
動的プログラミング アルゴリズムに関する質問を私と一緒に解決し、動的プログラミングを一緒に学びましょう!
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];
}
};
最後に次のように書きます。
以上が今回の記事の内容となります、読んでいただきありがとうございます。
何かを得たと感じたら、ブロガーに「いいね! 」を与えることができます。
記事の内容に抜けや間違いがある場合は、ブロガーにプライベートメッセージを送信するか、コメントエリアで指摘してください〜