学习目标:
目标:学习动态规划相关知识
学习内容:
本文内容:学习动态规划的思想并使用动态规划解决斐波那契数列、青蛙跳台阶、连续子数组的最大和、拆分语句等相关问题。
题目描述
题目描述
给出一个三角形,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字,
例如:
给出的三角形如下:
[[20],
[30,40],
[60,50,70],
[40,10,80,30]]
最小的从顶部到底部的路径和是:
20 +30 + 50 + 10 = 110。
注意:
如果你能只用O(N)的额外的空间来完成这项工作的话,就可以得到附加分,其中N是三角形中的行总数。
解题思路
这个题目是一个动态规划题目,我们需要分析出状态,状态转移方程以及初始状态
- 状态:
根据题目描述,我们需要求出从三角形顶部到底部的最小路径,所以我们的子状态就可以是从(n,n),(n,n-1)…(1,0)(1,1)(0,0)到底部的最小路径和
F(i,j):从(i,j)到三角形底部的最小路径和
- 状态递归:
F(i,j)=min(F(i+1,j),F(i+1,j+1))+triangle[i] [j]
triangle[i] [j]表示原三角矩阵
- 初始值:
F(n-1,0) = triangle[n-1][0], F(n-1,1) = triangle[n-1][1],…,F(n-1,n-1) = triangle[n- 1][n-1]
- 返回结果:
F(0, 0)
实现代码
public int minimumTotal(ArrayList<ArrayList<Integer>> triangle) {
for(int i=triangle.size()-2;i>=0;i--){
for(int j=0;j<=i;j++){
int curMin=triangle.get(i).get(j)+
Math.min(triangle.get(i+1).get(j),triangle.get(i+1).get(j+1));
triangle.get(i).set(j,curMin);
}
}
return triangle.get(0).get(0);
}