大家好鸭!这里是动态规划刷题频道,如果你也在学习动态规划,不妨一起来做做吧,题目选自LeetCode中等难度。
目录
👉Example 1(三角形最小路径和)
给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
示例 1:
输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
输出:11
解释:如下面简图所示:
2
3 4
6 5 7
4 1 8 3
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
示例 2:输入:triangle = [[-10]]
输出:-10LeetCode链接:三角形最小路径和
💎1.确定状态
状态:dp[i][j]表示走到第i行第j列的最小和。
情况1:走到第i行第1列,只能从第i-1行第1列走到
情况2:走到第i行第m(第i行的最后一列)列,只能从i-1行m-1列走到
情况3:走到中间既可以从i-1行j-1列走到,也可以从i-1行j列走到
😜2.状态转移方程
dp[i][0] = dp[i-1][0]+data (j = 0)
dp[i][m] = dp[i-1][m-1]+data (j = m)
dp[i][j] =min{dp[i-1][j],dp[i-1][j-1]}+data;
🎀3.初始条件及边界情况
dp[0][0] = trangle.get(0).get(0)
🚎4.计算顺序
dp[1][0] dp[1][1]
dp[2][0] dp[2][1] dp[2][2]
....
dp[n-1][0] dp[n-1][1] dp[n-1][2]...dp[n][m-1]
自上至下:
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
//自上到下,获取最大行和列
int n = triangle.size();
int m = triangle.get(n-1).size();
int min = Integer.MAX_VALUE;
int[][] dp = new int[n][m];
dp[0][0] = triangle.get(0).get(0);//初始化
for(int i=1; i<n; i++){
List<Integer> row = triangle.get(i);
dp[i][0] = row.get(0)+dp[i-1][0];
for(int j=1; j<row.size(); j++){
if(j == row.size()-1){
dp[i][j] = dp[i-1][j-1]+row.get(j);
}
else{
dp[i][j] = Math.min(dp[i-1][j],dp[i-1][j-1])+row.get(j);
}
}
}
//找最后一行的最大值
for(int num:dp[m-1]){
if(num<min){
min = num;
}
}
return min;
}
}
自下至上

本文详细介绍了四个LeetCode中的动态规划和字符串处理问题,包括三角形最小路径和、交错字符串、解决智力问题以及数字1的个数。分别解析了每个问题的状态定义、状态转移方程、初始条件、计算顺序,并提供了相应的Java实现。通过这些实例,帮助读者深入理解动态规划和字符串处理技巧。

最低0.47元/天 解锁文章
617

被折叠的 条评论
为什么被折叠?



