关闭

Middle-题目60:120. Triangle

61人阅读 评论(0) 收藏 举报
分类:

题目原文:
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).
题目大意:
给出一个三角形,求出从顶点到底边路径的最小值,每次只能向下移动到相邻的元素上。
分析:
令dp[i][j]代表从顶点走到[I,j]点的最小和,那么要么是从正上方来的,要么是从左上方来的,故有:
dp[i][j] = min(dp[i-1][j], dp[i-1][j-1])+triangle[i][j],对两边的特殊讨论一下。
最后再对最后一行的dp值取最小值。
源码:(language:java)

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

成绩:
5ms,beats 57.96%,众数4ms,23.76%
Cmershen的碎碎念:
这道题在本科的《算法设计与分析》课上学过原题,可见是一个很经典也很有代表性的DP问题。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:56046次
    • 积分:3202
    • 等级:
    • 排名:第10679名
    • 原创:270篇
    • 转载:53篇
    • 译文:0篇
    • 评论:7条
    文章分类
    最新评论