LeetCode 62件の質問:異なる経路(動的プログラミング)

住所:HTTPS://leetcode-cn.com/problems/unique-paths/

方法の一つ:動的計画

  • ステータス:dp[i][j]表す座標歩いた(i, j)パスの総数。

  • 状態遷移方程式:アイデアは、分類された議論は座標が入ったままで(i, j)トップダウンから得ることができる、あなたはまた、左から来ることができる、それは2つのパスの合計です。

dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
  • 初期化:アレイdpの行1列1は、1の値を表示していました。

  • 出力:dp[m - 1][n - 1]

  • 圧縮の状態:あなたは、配列をスクロールすることができますまた、単に一次元に圧縮することができます。

Javaコード:

import java.util.Arrays;

public class Solution {

    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        Arrays.fill(dp[0], 1);

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

初期あまりにも面倒、それは「センチネル」書き込み、配列と考えることができdp、書き込みライン、書き込み1。

Javaコード:

import java.util.Arrays;

public class Solution {

    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m + 1][n + 1];
        // 初始化的时候 dp[0][1] = 1; 或者 dp[1][0] = 1; 均可
        dp[1][0] = 1;

        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                dp[i + 1][j + 1] = dp[i][j + 1] + dp[i + 1][j];
            }
        }
        return dp[m][n];
    }
}

圧縮の状態。

Javaコード:

public class Solution {

    public int uniquePaths(int m, int n) {
        int[] dp = new int[n];
        dp[0] = 1;

        for (int i = 0; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[j] += dp[j - 1];
            }
        }
        return dp[n - 1];
    }
}

方法2:組み合わせの数

、座標行きまし解決するための組み合わせの数を使って(m, n)歩く、場所のをm - 1右に移動し、グリッドをn - 1フォーマット。私たちは、総歩いm + n - 2グリッドを。

公開された442元の記事 ウォンの賞賛330 ビュー123万+

おすすめ

転載: blog.csdn.net/lw_power/article/details/103816866