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

所有热爱的事情都要不遗余力

题目

  • 给定一个三角形 triangle ,找出自顶向下的最小路径和。

  • 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1

示例 1:

输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
输出:11
解释:如下面简图所示:
   2
  3 4
 6 5 7
4 1 8 3
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

题解

  • 分析得。采取动态规划 , 至低向上递推

  • 状态定义 dp[i][j]表示从点(i,j)到底边的最小路径和。

  • 状态转移dp[i][j]=min (dp[i+1][j], dp[i+1][j+1]) + triangle[i][j]

代码

package leetcodePlan;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

public class P0120 {

	public static void main(String[] args) {

		    //List<List<Integer>> triangle = [[2],[3,4],[6,5,7],[4,1,8,3]] ;
			// {{2},{3,4},{6,5,7},{4,1,8,3}} ;
		
		//  初始化
		List<List<Integer>> triangle = new ArrayList<>();
		Deque<Integer> row1 = new ArrayDeque<>(1);
		Deque<Integer> row2 = new ArrayDeque<>(2);
		Deque<Integer> row3 = new ArrayDeque<>(3);
		Deque<Integer> row4 = new ArrayDeque<>(4);
		row1.addLast(2);
		
		row2.addLast(3) ;
		row2.addLast(4) ;
		
		row3.addLast(6);
		row3.addLast(5);
		row3.addLast(7);
		
		row4.addLast(4);
		row4.addLast(1);
		row4.addLast(8);
		row4.addLast(3);
		
		
		triangle.add(new ArrayList<>(row1)) ;
		triangle.add(new ArrayList<>(row2)) ;
		triangle.add(new ArrayList<>(row3)) ;
		triangle.add(new ArrayList<>(row4)) ;
		
		
		System.out.println(fun(triangle));
	}
	
	public static int fun(List<List<Integer>> triangle) {
		int n = triangle.size() ;    // 有点类似于  二维数组
		
		int [][] dp = new int[n+1][n+1] ;
		
		
		//  从三角形得最后一行  开始递归
		
		for(int i = n -1 ; i >= 0 ; i-- ) {    // 行
			for(int j = 0 ; j <= i ;j++) {     // 列
				dp[i][j] = Math.min(dp[i+1][j], dp[i+1][j+1] )+ triangle.get(i).get(j) ;
			}
		}
		
		return dp[0][0] ;
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值