この質問はインタビューで比較的一般的です。主にアルゴリズムの理解を調査します。最適な解決策は動的プログラミングです。この記事では、この質問の動的プログラミングのアイデアと解決策について説明します。
異なるパス
タイトルの説明
ロボットはmxnグリッドの左上隅にあり(図の開始点は「開始」です)、ロボットは一度に1つ下または右にしか移動できません。ロボットはグリッドの右下隅に到達しようとします(図では「完了」とマークされています)。合計でいくつの異なるパスがありますか?
例1:
入力:m = 3、n = 2
出力:3
説明:左上隅から開始して、右下隅に到達できる合計3つのパスがあります。
- 右→右→下
- 右→下→右
- 下->右->右
例2:
入力:m = 7、n = 3
出力:28
ヒント:
- 1 <= m、n <= 100
- 回答が2 * 10 ^ 9(int型)以下であることを確認するための質問データ
ソリューションのアイデア
- ブルートフォース方式:(1、1)->(m、n)からDFSトラバーサルを使用し、右下隅に到達すると、トラバーサルが終了するまでカウントが1ずつ増加します。ユースケースの一部しか解決できない、タイムアウトを実行する、時間の複雑さO(N ^ 2)
- 動的計画:新しい状態スペースを開き、各ポイントの状態値を保存します。状態値は、ポイントに到達するために到達できるパスの数を表します。最終的に右下隅に到達すると、この時点で記録されたパスの数は、異なるパスの総数です。2次元配列の状態値は一度だけトラバースする必要があるため、時間の複雑さはO(N)です。
各ポイントの状態値を見つける方法は?この問題は数学的帰納法を使用しています。観察により
、m = 1、n = 1の場合、開始点は右と下に移動せずに到達し、パスの数は1です
。m= 1、n = 2の場合出発点ダウンのみターゲットポイントに到達するための1つのステップ、ウェイの数は1です
。m= 2、n = 1の場合、開始ポイント右のみターゲットポイントに到達するための1つのステップ、ウェイの数は1です
。m= 2、n = 2の場合、開始ポイントは右へ一歩、そして次へ、またはまず下から右ターゲットポイントに到達するためのウェイの数は2です
。m= 2、n = 3の場合、開始ポイントは2ステップ下、次に1ステップ右、またはポイント(2、2)から次のステップ、およびポイント(2、2 )2であるので、ターゲットポイントに到達する方法の合計数は3です。
したがって、法則を見つけることができます。ポイントに到達する方法の数(m、n)は(m-1、n)ウェイの数+(m 、n-1)ウェイの数の合計、つまり:ステータス[m] [n] =ステータス[m-1] [n] +ステータス[m] [n-1](状態伝達方程式)
コードの実装
再帰的なコード
int status[101][101] = {0};
int uniquePaths(int m, int n)
{
if(m <= 0 || n <= 0) {
return 0;
}
if(m == 1 || n == 1) {
return 1;
}
// 当该点状态值 > 0 时,说明已经计算过路径数,无需重复计算
if(status[m][n] > 0) {
return status[m][n];
}
status[m - 1][n] = uniquePaths(m - 1, n);
status[m][n - 1] = uniquePaths(m, n - 1);
status[m][n] = status[m - 1][n] + status[m][n - 1];
return status[m][n];
}
反復コード
int uniquePaths(int m, int n)
{
int status[101][101] = {0};
int i, j;
for(i = 1; i <= m; i++) {
for(j = 1; j <= n; j++) {
if(i == 1 || j == 1) {
status[i][j] = 1;
}
else {
status[i][j] = status[i - 1][j] + status[i][j -1];
}
}
}
return status[m][n];
}