Triangle(DP)

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

For example, given the following triangle

[
     [2],
    [3,4],
   [6,5,7],
  [4,1,8,3]
]

 

The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

State: f[i][j] 表示跳到第(i,j)的位置的最小路径和。

Function:f[i][j] = min (f[i - 1][j - 1], f[i - 1][j])  (j != 0, j != i)

Initializtion: f[i][0] = f[i - 1][0] + a[i][0]  f[i][i] = f[ i - 1][i - 1] + a[i][i]

Answer: min(最后一行的值)

 1 public class Solution {
 2     public int minimumTotal(List<List<Integer>> triangle) {
 3         if (triangle == null || triangle.size() == 0) {
 4             return 0;
 5         }
 6         
 7         int m = triangle.size();
 8         int[][] f = new int[m][m];
 9         f[0][0] = triangle.get(0).get(0);
10         for (int i = 1; i < m; i++) {
11             f[i][0] = f[i - 1][0] + triangle.get(i).get(0);
12             f[i][i] = f[i - 1][i - 1] + triangle.get(i).get(i);
13         }
14         
15         for (int i = 1; i < m; i++) {
16             for (int j = 1; j < i; j++) {
17                 f[i][j] = Math.min(f[i - 1][j], f[i - 1][j - 1]) + triangle.get(i).get(j);
18             }
19         }
20         int min = Integer.MAX_VALUE;
21         for (int i = 0; i < m; i++) {
22             min = Math.min(min, f[m - 1][i]);
23         }
24         return min;
25     }
26 }

 

转载于:https://www.cnblogs.com/FLAGyuri/p/5403183.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值