java 动态规划(三角形最短路径和)

该博客介绍了如何使用Java实现动态规划算法来解决三角形中最短路径和的问题。示例中给出了一种自底向上的方法,通过逐层迭代,将每个节点的最小路径和更新到上一层,最终得到顶部元素即为最短路径和。提供的代码实现了这一逻辑,并在测试用例中得到了11的最短路径和。

java 动态规划(三角形最短路径和)

 

 

**************************

三角形最短路径和

 

问题描述

给定一个三角形,找出自顶向下的最小路径和
每一步只能移动到下一行中相邻的结点上(相邻节点:索引相同、索引+1)


示例:
[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

最短路径和:11 (2+3+5+1)

 

动态规划求解:自底向上,相邻元素取较小者,替换上层对应元素,最终返回顶层元素

              

             

             

 

 

**************************

示例

 

public class MyTest4 {

    public static List<List<Integer>> generate(){
        List<List<Integer>> lists=new ArrayList<>();

        List<Integer> list=new ArrayList<>();
        list.add(2);

        List<Integer> list2=new ArrayList<>();
        list2.add(3);
        list2.add(4);

        List<Integer> list3=new ArrayList<>();
        list3.add(6);
        list3.add(5);
        list3.add(7);

        List<Integer> list4=new ArrayList<>();
        list4.add(4);
        list4.add(1);
        list4.add(8);
        list4.add(3);

        lists.add(list);
        lists.add(list2);
        lists.add(list3);
        lists.add(list4);

        return lists;
    }

    public static int fun(List<List<Integer>> lists){
        int size=lists.size();

        if (size==0){
            return 0;
        }

        if (size==1){
            return lists.get(0).get(0);
        }

        for (int i=size-1;i>0;i--){
            List<Integer> curList=lists.get(i);
            List<Integer> preList=lists.get(i-1);

            for (int j=0;j<curList.size()-1;j++){
                int cur=curList.get(j);
                int next=curList.get(j+1);

                int value=preList.get(j);
                preList.set(j,Math.min(cur,next)+value);
            }
        }

        return lists.get(0).get(0);
    }

    public static void main(String[] args){
        System.out.println("最短路径和为:"+fun(generate()));
    }
}

 

控制台输出

最短路径和为:11

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值