您的位置:首页 > 其它

Middle-题目60:120. Triangle

2016-05-31 16:31 453 查看
题目原文:

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问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: