三角形最小路径和

动态规划,最后路径和最小,那么每一步必须最小

一、求解 

求出到达最后一层的所有最小路径,然后再求出其中最小的即可。

初始化二维数组用来存放结果

final int size = triangle.get(triangle.size() - 1).size();
int[][] result = new int[size][size];
result[0][0] = triangle.get(0).get(0);

状态转移方程

\small result[i][j] = Min(result[i-1][j-1] + triangle[i][j],result[i-1][j] + triangle[i][j])           \small 0<j<length - 1

\small result[i][j] = result[i - 1][j] + triangle[i][j]                                                                      \small j = 0

\small result[i][j] = result[i-1][j-1]+triangle[i][j]                                                                \small j = length - 1

其中的length对应三角形中每一行的路径长度。

填表

 0123
02   
156  
2111013 
315111816

代码

public static int minimumTotal(List<List<Integer>> triangle) {

        final int size = triangle.get(triangle.size() - 1).size();
        int[][] result = new int[size][size];
        result[0][0] = triangle.get(0).get(0);
        if (size == 1){
            return result[0][0];
        }
        int min = Integer.MAX_VALUE;

        for (int i = 1; i < size; i++){
            for (int j = 0; j < triangle.get(i).size(); j++) {
                if (j - 1 >= 0){

                    if (j == triangle.get(i).size() - 1){
                        result[i][j] = result[i-1][j-1] + triangle.get(i).get(j);
                    }else {
                        result[i][j] = Math.min(result[i -1][j - 1] + triangle.get(i).get(j), result[i -1][j] + triangle.get(i).get(j));
                    }
                }else {
                    result[i][j] = result[i - 1][j] + triangle.get(i).get(j);
                }
                if (i == size - 1){
                    min = Math.min(min, result[i][j]);
                }
            }
        }
        return min;

    }

二、优化

根据上边的转移方程以及填表的过程,要想保存前一个转移状态的话,那么只能倒着来计算最短路径,因为计算当前状态的值要用到前一状态,如果从上往下计算的话,前一天状态就会被覆盖。

初始状态

0123
4183

填表

扫描倒数第二行:

0123
76103

扫描倒数第三行:

0123
910103

扫描倒数第四行:

0123
1110103

代码

public static int minimumTotal(List<List<Integer>> triangle) {
        final int size = triangle.get(triangle.size() - 1).size();
        int[] result = new int[size];
        for (int i = 0; i < size; i++) {
            result[i] = triangle.get(triangle.size() - 1).get(i);
        }

        int length = triangle.size() - 2;
        for (int i = length; i >= 0; i--) {
            for (int j = 0; j < triangle.get(i).size(); j++) {
                result[j] = Math.min(triangle.get(i).get(j)+result[j], triangle.get(i).get(j)+result[j + 1]);
            }
        }
        return result[0];

    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值