动态规划Dynamic Programming:通过把原问题分解为相对简单的子问题的方法来求解复杂问题的方法。
把求解的问题分成多个阶段或多个子问题,然后按照顺序求解各子问题。前一子问题的解,为后一问题的求解提供了有用信息。依次解决各个子问题,最后一个阶段的解就是初始问题的解。
动态规划问题,大致可以通过以下4个步骤:
1)划分状态,即划分子问题
2)状态表示,即如何让计算机理解子问题。
3)状态转移,即父问题是如何由一个子问题或者多个子问题得到的。
4)确定边界,确定初始状态是什么?最小的子问题?最终状态又是什么。
Leetcode 120 Triangle
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).
1)子问题 将原问题分解成求解从以每个坐标结尾的最小path sum
2)状态表示 dp[i][j]表示以第i行第j列结尾的最小path sum的值
3)状态转移 dp[i][j] = min{dp[i-1][j]+triangle[i][j], dp[i-1][j-1] + triangle[i][j]}
4)最小子问题dp[0] ,最终状态 dp[triangle.length-1]数组的最小值
/*
dp[i][j] = min{dp[i-1][j]+triangle[i][j], dp[i-1][j-1] + triangle[i][j]}
return min{dp[n][j]} 0<=j<n
*/
public int minimumTotal(List<List<Integer>> triangle) {
List<Integer> upRowList, curRowList;
for(int i =