Leetcode問題解決62-異なるパス

問題の説明

ロボットは、mxnグリッドの左上隅にあります(下の図では、開始点は「開始」とマークされています)。
ロボットは一度に1ステップ下または右にしか移動できません。ロボットはグリッドの右下隅に到達しようとします(下の画像で「完了」とマークされています)。
合計でいくつの異なるパスがありますか?

例1:
ここに画像の説明を挿入

输入:m = 3, n = 7
输出:28

例2:

输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右

例3:

输入:m = 7, n = 3
输出:28

例4:

输入:m = 3, n = 3
输出:6

注意:
1 <= m、n <= 100の
質問データは、回答が2 * 109以下であることを保証します。

問題解決のアイデア:

f(i、j)を使用して、左上隅から(i、j)までのパスの数を表します。ここで、iとjの範囲はそれぞれ[0、m)と[0、n)です。

各ステップで1ステップ下または右にしか移動できないため、(i、j)に移動する場合は、1ステップ下に移動すると、(i-1、j)から移動します。右に一歩、それからそれは(i、j-1)から来るでしょう。したがって、動的計画法の遷移方程式を書くことができます。

f(i、j)= f(i-1、j)+ f(i、j-1)

i = 0の場合、f(i-1、j)は要件を満たす状態ではないことに注意してください。同様に、j = 0の場合、f(i、j-1)はこの項目を無視する必要があります。 )要件を満たす状態ではないため、これを無視する必要があります。

初期条件はf(0,0)= 1です。つまり、左上隅から左上隅に移動する方法があります。

最終的な答えはf(m-1、n-1)です。

コード

class Solution {
    
    
    //最优子结构:到达点i,j的方法总数等于到达正上方点i-1,j和点i,j-1正左方的方法总数之和
   	public int uniquePaths(int m, int n) {
    
    
		int ways[][]=new int[m][n];
        //初始化状态数组
		for(int i=0;i<m;i++){
    
    
			ways[i][0]=1;
		}
		for(int i=0;i<n;i++){
    
    
			ways[0][i]=1;
		}
        //使用状态转移方程求解整个数组
		for(int i=1;i<m;i++){
    
    
			for(int j=1;j<n;j++){
    
    
				ways[i][j]=ways[i-1][j]+ways[i][j-1];
			}
		}
		return ways[m-1][n-1];
    }
}

おすすめ

転載: blog.csdn.net/qq_39736597/article/details/110918835