动态规划刷题篇(二)

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

大家好鸭!这里是动态规划刷题频道,如果你也在学习动态规划,不妨一起来做做吧,题目选自LeetCode中等难度。

目录

👉Example 1(三角形最小路径和)

👉Example 2(交错字符串)

👉Example 3 (解决智力问题)

👉Example 4(数字1的个数)


👉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]]
输出:-10

LeetCode链接:三角形最小路径和

💎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;
    }
}

自下至上

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南 栀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值