通过万岁!!!
- 题目:就是给你一个三角形的数组tri,然后让你从头开始出发,途径的地方有数,就进行累加,然后到最后一层时,如何让身上的数最小。
- 思路:首先这个题也是动态规划的题目。首先明确,我们在任何一行,都可以发现,这是一个子问题,所以基本确定可以用dp。然后就是定义一个dp数组,这个数组我定义的时n*n的,其中n是给定的三角形数组的行数。进阶版说将空间复杂度降低到n,但是我没想到。这个数组中要保存一些内容,就是到达i,j位置的数最小数之和是多少。然后dp[i, j]=min(dp[i-1, j], dp[i-1, j-1])+tri[i, j]。最后我们返回dp数组最后一行的最小值即可。
- 技巧:动态规划
java代码
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
// 这个题,我们需要记录,第i行,第j列位置的值,然后返回最后一行的最小值即可。
int size = triangle.size();
int[][] dp = new int[size][size];
dp[0][0] = triangle.get(0).get(0);// 这个数组,我们的主对角线和第一列需要先进行填充
int t1 = 0, t2 = 0;
for (int i = 0; i < size; i++) {
t1 += triangle.get(i).get(0);
t2 += triangle.get(i).get(i);
dp[i][0] = t1;
dp[i][i] = t2;
}
for (int i = 1; i < size; i++) {
for (int j = 1; j < i; j++) {
dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - 1]) + triangle.get(i).get(j);
}
}
int ans = Integer.MAX_VALUE;
for (int i = 0; i < size; i++) {
ans = Math.min(dp[size - 1][i], ans);
}
return ans;
}
}
- 总结:其实按照我的四个步骤来,动态规划的题目也不是很难。