Leetcode 120. Triangle
2016-10-01 19:27
323 查看
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] = min(dp[i-1][j-1],dp[i-1][j])+list[i][j], dp[i][j]表示从顶点到第i行第j个元素最小值
经观察,可以转化为
dp[i] = min(dp[i-1],dp[i])+list[i][j](此处的j要逆序进行,不熟悉此种技巧的可以拿笔计算下);
AC代码:
[
[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] = min(dp[i-1][j-1],dp[i-1][j])+list[i][j], dp[i][j]表示从顶点到第i行第j个元素最小值
经观察,可以转化为
dp[i] = min(dp[i-1],dp[i])+list[i][j](此处的j要逆序进行,不熟悉此种技巧的可以拿笔计算下);
AC代码:
public class Solution { public int minimumTotal(List<List<Integer>> triangle) { if(triangle == null){ return 0; } return dp(triangle); } public int dp(List<List<Integer>> triangle){ int min=Integer.MAX_VALUE; int[] dp = new int[triangle.size()]; for(int i=0;i<triangle.size();i++){ min=Integer.MAX_VALUE; for(int j=i;j>=0;j--){ if(i==0){ dp[0]=triangle.get(0).get(0); }else{ if(j==i){ dp[j]=triangle.get(i).get(j)+dp[j-1]; }else if(j==0){ dp[j]+=triangle.get(i).get(j); }else { dp[j]=Math.min(dp[j],dp[j-1])+triangle.get(i).get(j); } } if(dp[j]<min){ min=dp[j]; } } } return min; } }
相关文章推荐
- LeetCode *** 120. Triangle
- LeetCode 120. Triangle (Python)最优解--Apolo_Shane
- Leetcode-120. Triangle
- [leetcode]120. Triangle
- leetcode题解-120. Triangle
- 【LeetCode】120. Triangle
- [LeetCode] 120. Triangle
- [leetcode] 120. Triangle
- [leetcode]120. Triangle
- 第十四周:[leetCode] 120. Triangle
- LeetCode 120. Triangle
- (DP)LeetCode#120. Triangle
- Leetcode 120. Triangle (Medium) (cpp)
- leetcode 120. Triangle
- leetcode-120. Triangle
- LeetCode 120. Triangle
- LeetCode 120. Triangle
- [leetcode] 120. Triangle
- LeetCode解题报告 120. Triangle [medium]
- leetcode-120. Triangle