LeetCode - ユニーク - パス

Q:ロボット(開始位置、「開始」と表示された数字)は、M×N個のマップの左上隅のサイズです。
たびに右または下にロボットが動きます。ロボットは、地図の右下に到達することです。(終了位置、「完了」と表示された数字)。
どのように多くの種類が開始点からパスの最後に来ることができますか?
注:mおよびnは、100以下であります

A:一般的な動的なプログラミングの問題。

    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        for (int i = 0; i < m; i ++)
            dp[i][0] = 1;
        for (int i = 0; i < n; i ++)
            dp[0][i] = 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];
    }

Q:タイトル「ユニークなパス」について考え続ける:
あなたは、図中の障害の数を追加した場合、どのように多くの異なるパス?
それぞれ0および空き領域および障害を示し
、例えば、
図に示す図で中央障害物を3 A * 3。
[↵[0,0,0]↵[ 0,1,0]↵[0,0,0]↵]
2つの異なるパスにあり
、m及びn 100を超えない:備考
A:障害物があります0にセットのような

    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int[][] dp = new int[obstacleGrid.length][obstacleGrid[0].length];
        for (int i = 0; i < dp.length; i ++ ) {
            if(obstacleGrid[i][0] == 1) break;
            dp[i][0] = 1;
        }
        for (int i = 0; i < dp[0].length; i ++ ) {
            if(obstacleGrid[0][i] == 1) break;
            dp[0][i] = 1;
        }
        for (int i = 1; i < dp.length; i ++ ) {
            for (int j = 1; j < dp[0].length; j ++ ) {
                if(obstacleGrid[i][j] == 1) dp[i][j] = 0;
                else dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[dp.length - 1][dp[0].length - 1];
    }

おすすめ

転載: www.cnblogs.com/xym4869/p/12527512.html