代码随想录|动态规划 62.不同路径 、 63. 不同路径 II

62.不同路径

题目

参考文章

思路:这道题其实就是正常的动态规划思路,动态规划本质是自底向上的过程。

这里首先初始化,因为由题目只,只能向右或向下移动,所以dp[i][0]和dp[0][j]都是只有一条路径的

所以初始化为dp[i][0]=1,dp[0][j]=1;

又因为dp[i][j]存储的是到达当前位置的总路径数,所以是当前位置的相邻格子的总路径数相加得到。

代码:

class Solution {
    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][j-1]+dp[i-1][j];
            }
        }

        return dp[m-1][n-1];
    }
}

63. 不同路径 II

题目

参考文章

思路:本题还是靠动态规划的本质,其实和上一题 62.不同路径 思路是一致的,只是因为方格中多了一个障碍,所以要多加一些判断条件。即当遇到障碍物时,当前点设置为0,而且初始化时,如果dp[i][0],dp[0][j]的某一个位置出现障碍物,其之后的的位置都是不能通过的,所以都是0,此时判断出此条件后,推出初始化循环即可

代码:

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m=obstacleGrid.length;
        int n=obstacleGrid[0].length;
        if(obstacleGrid[0][0]==1||obstacleGrid[m-1][n-1]==1){
            return 0;
        }

        int[][] dp=new int[m][n];
        for(int i=0;i<m&&obstacleGrid[i][0]==0;i++){
            dp[i][0]=1;
        }
        for(int i=0;i<n&&obstacleGrid[0][i]==0;i++){
            dp[0][i]=1;
        }

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

        return dp[m-1][n-1];
    }
}

343.整数拆分

思路:把数拆分成尽可能的相等才有可能最大

还是不怎么懂

96.不同的二叉搜索树

思路:如n=3,可以通过n=1和n=2得到的二叉树情况得到。dp就是当前个数下有多少种二叉树

dp[3]=dp[2]dp[0]+dp[1]dp[1]+dp[0]dp[2]

可得

dp[i]+=dp[j-1]dp[i-j]

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值