leetcode120. 三角形最小路径和(动态规划)

**给定一个三角形,找出自顶向下的最小路径和。**每一步只能移动到下一行中相邻的结点上。

相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。

例如,给定三角形:

[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

二维的动态规划代码

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {

        int n=triangle.size(),m=triangle.get(n-1).size();
        int[][] dp=new int[n][m];//存储到当前节点的最小路径总和
              for(int i=0;i<n;i++)
        Arrays.fill(dp[i],Integer.MAX_VALUE);
        dp[0][0]=triangle.get(0).get(0);
        for(int i=1;i<n;i++)
            for(int j=0;j<triangle.get(i).size();j++)
            {
                if(j==0) dp[i][j]=dp[i-1][j]+triangle.get(i).get(j);//最左边的元素只能从上面的格子下来
                else dp[i][j]=Math.min(dp[i-1][j],dp[i-1][j-1])+triangle.get(i).get(j);//从左上或者正上下来
            }
        int res=Integer.MAX_VALUE;
        for(int j=0;j<m;j++) res= Math.min(res,dp[n-1][j]);
        return res;
    }
}

一维的动态规划代码

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int n=triangle.size();
        int[] dp=new int[n+1];
        for (int i=n-1;i>=0;i--)//从下往上
        for (int j=0;j<=i;j++)
          dp[j]=Math.min(dp[j+1],dp[j])+triangle.get(i).get(j);
        return dp[0];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值