题目原文:
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问题。