Dynamic Programming——No.120 Triangle

博客围绕三角形数组求从顶到底的最短路径长度问题展开。介绍了自上而下的解法,通过给数组位置编号,从右往左更新dp数组;还提及自下而上的最优思路,取相邻元素最小值往上传,顶部元素即为最小值,省去排序过程。

Problem:

Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

Explanation:

给一个三角形数组,每次只能往下一行的相邻数字走,求走到底的最短路径长度。

My Thinking:

给三角形数组的位置进行编号,

                     0

                 0      1

              0      1     2

          0     1        2      3

       0     1     2        3      4

我们发现到每个结点dp[i]之前的最短路径应该是原dp[i-1]和原dp[i]的最小值,特例是每一行的第一个元素和最后一个元素,第一个元素只能接着原dp[i]继续增加,最后一个元素只能接着原dp[i-1]继续增加,由于要比较原dp[i-1]和原dp[i]的最小值,因此只能从右往左进行更新dp数组。解法是自上而下。

My Solution:

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int rows=triangle.size();
        Integer[] dp=new Integer[triangle.get(rows-1).size()];
        dp[0]=triangle.get(0).get(0);
        //从第二行开始,从右向左更新数组
        for(int i=1;i<rows;i++){
            for(int j=i;j>=0;j--){
                int nownum=triangle.get(i).get(j);
                //若是该行第一个数
                if(j==0){
                    dp[j]=dp[j]+nownum;
                }else if(j==i){//若是该行最后一个数
                    dp[j]=dp[j-1]+nownum;
                }else{
                    dp[j]=Math.min(dp[j],dp[j-1])+nownum;
                }
            }
        }
        return Collections.min(Arrays.asList(dp)).intValue();
    }
}

Optimum Thinking:

自下而上,取两个相邻元素的最小值,往上传,这样顶部的唯一元素就是最小值,省去了排序过程。

Optimum Solution:

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int[] A = new int[triangle.size()+1];
        for(int i=triangle.size()-1;i>=0;i--){
            for(int j=0;j<triangle.get(i).size();j++){
                A[j] = Math.min(A[j],A[j+1])+triangle.get(i).get(j);
            }
        }
        return A[0];
    }
}

 

o3d.visualization.draw_geometries([pcd] + combined_arrows + [point]) TypeError: draw_geometries(): incompatible function arguments. The following argument types are supported: 1. (geometry_list: List[open3d.cpu.pybind.geometry.Geometry], window_name: str = 'Open3D', width: int = 1920, height: int = 1080, left: int = 50, top: int = 50, point_show_normal: bool = False, mesh_show_wireframe: bool = False, mesh_show_back_face: bool = False) -> None 2. (geometry_list: List[open3d.cpu.pybind.geometry.Geometry], window_name: str = 'Open3D', width: int = 1920, height: int = 1080, left: int = 50, top: int = 50, point_show_normal: bool = False, mesh_show_wireframe: bool = False, mesh_show_back_face: bool = False, lookat: numpy.ndarray[numpy.float64[3, 1]], up: numpy.ndarray[numpy.float64[3, 1]], front: numpy.ndarray[numpy.float64[3, 1]], zoom: float) -> None Invoked with: [PointCloud with 5 points., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., TriangleMesh with 124 points and 240 triangles., array([4., 0., 0.], dtype=float32)]
最新发布
03-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值