62. Unique Paths

机器人走棋盘,左上到右下。

比较典型的动态规划,某个格的情况无非是从上面或者从左边来,两者相加就行。

public class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        
        dp[0][0] = 1;
        
        for(int i = 0; i<m;i++)
            for(int j = 0; j < n;j++)
            {
                if(i < m-1) dp[i+1][j]+= dp[i][j];
                if(j < n-1) dp[i][j+1]+= dp[i][j];
            }
    
        return dp[m-1][n-1];
    }
}

空间上似乎可以优化。

只保留当前列和前一列,就有上面和左面的值。

三刷再看看。


三刷?

棋盘里找路径,典型的DP。

dp[i][j]的值来自于dp[i-1][j]和dp[i][j-1]

需要优化的是空间。

dp[i][j]算出来之后,他的值会被使用2次,一次是贡献给他左边的格子dp[i][j+1],一次是他下面的格子dp[i+1][j]。

我们遍历进行计算的时候,是一行一行来的,每个格子的值来源于上这一行的前一个格子(左边),和上一行的同一个格子(上边),然后更新。

水平方向的贡献是累加的,可以适时更新每一行。

public class Solution {
    public int uniquePaths(int m, int n) {
        
        int[] dp = new int[n+1];
        dp[1] = 1;
        
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                dp[j+1] = dp[j+1] + dp[j];
            }
        }
        
        return dp[n];
    }
}
原文地址:https://www.cnblogs.com/reboot329/p/6206191.html