动态规划例题(代码随想录学习)——持续更新

这篇具有很好参考价值的文章主要介绍了动态规划例题(代码随想录学习)——持续更新。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

例题:不同路径2(带障碍)

题目描述:

动态规划例题(代码随想录学习)——持续更新,动态规划,学习,算法

dp数组的定义 :

dp[i][j]的含义是:从(0,0)到(i,j)的不同路径

递推公式:

当路线中有了障碍,此路不通,所以在不同路径的递推公式上需要增加条件

if(obs[i,j]==0)没有障碍,dp[i][j]= dp[i-1][j]+dp[i][j-1]

if(obs[i][j]==1)有障碍,不进行推导

obs数组表示障碍

初始化dp数组

动态规划例题(代码随想录学习)——持续更新,动态规划,学习,算法

障碍的后面应该是0(原因:遇到障碍后,即使我们越过障碍,也无法再去障碍的后面,因为题目要求只能向右或向下,要想回到障碍后面则需要向左和向上,所以障碍的后面路径为0)

由此,考虑一种特殊情况:当障碍在起始位置、终止位置时路径为0

for(int i=0;i<m&&obs[i][0]==0;i++) dp[i][0]=1;

for(int j=0;j<n&&obs[0][j]==0;j++)     dp[0][j]=1;

遍历顺序

从左到右,从上到下

相关代码

c++

class solution
{
 public:
   int uniquePathWithObstacles(vector <vector<int>>&obstacleGrid)
   {
     int m=obstacleGrid.size();
     int n=obstacleGrid.size();
     if(obstacleGrid[m-1][n-1]==1||obstacleGrid[0][0]==1)  return 0;
     //在起点、终点及它们的前面出现障碍,无法到达
     vector<vector<int>> dp(m,vector<int>(n,0));
     for(int i=0;i<m&&obstacleGrid[i][0]==0;i++)  dp[i][0]=1;
     {
       for(int j=0;j<n&&obstacleGrid[0][j]==0;j++)  dp[0][j]=1; 
       {
            if (obstacleGrid[i][j]=1) continue;
            dp[i][j]=dp[i-1][j]+[dp[i][j-1];
       }
     }
    return dp[m-1][n-1];
   }
}

时间复杂度:O(m×n)

空间复杂度:O(m×n)

空间优化代码

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        if (obstacleGrid[0][0] == 1)
            return 0;
        vector<int> dp(obstacleGrid[0].size());
        for (int j = 0; j < dp.size(); ++j)
            if (obstacleGrid[0][j] == 1)
                dp[j] = 0;
            else if (j == 0)
                dp[j] = 1;
            else
                dp[j] = dp[j-1];

        for (int i = 1; i < obstacleGrid.size(); ++i)
            for (int j = 0; j < dp.size(); ++j){
                if (obstacleGrid[i][j] == 1)
                    dp[j] = 0;
                else if (j != 0)
                    dp[j] = dp[j] + dp[j-1];
            }
        return dp.back();
    }
};

时间复杂度:O(m×n)

空间复杂度:O(m)

例题:整数拆分

题目描述:

题目理解:

2 = 1+1   1×1=1

10=3+3+4  3×3×4=36 

思考: 让每个拆分后的数近似相等

如何拆分?

10=2+8  -->8=2+6 -->6=2+4 (递推的思路,有了递推的思路之后,就可以思考可以使用动态规划)

dp数组的定义 :

dp[i]代表第i个数的乘积最大化

对i个数进行拆分,得到的最大乘积为dp[i]

递推公式:

i:

    两个数:jx(j-i)

 三个数及三个数以上:jxdp[i-j]

问题:为什么只拆i,不拆j

固定了j,其余的式子只要拆i-j原因:只要其他的拆分式子中包含j,则相当于j的拆分

问题:式子是否改为dp[j]xdp[i-j]更合理?

这里默认了i会被拆分为4个数

初始化dp数组

 dp[0]=0   dp[1]=0  dp[2]=1(前面两种是没有意义的,从2开始有意义)

遍历顺序

for(i=3;i<=n;i++)

for(j=1;j<i;j++)  

dp[i]=max(j×(i-j),jxdp[i-j],dp[i]

尝试不同的j值进行拆分,根据上面的两种情况取最大,当换下一个j的时候,就和当前的dp[i]比较,相当于取不同j下面的最大值

相关代码

动规代码:

class solutin
{
 public:
   int integerBreak(int n)
   {
      vector<int> dp(n+1);
      dp[2]=1;
      for(int i=3;i<=n;i++
     {
       for(int j=1;j<=i;j++)
       dp[i]=(dp[i],max(j*(i-j),j*dp[i-j]));
     }
   }
   return dp[n];
}

时间复杂度:O(n^2)

空间复杂度:O(n) 

贪心代码:

初始化逻辑有问题文章来源地址https://www.toymoban.com/news/detail-848274.html

class Solution {
public:
    int integerBreak(int n) {
        if (n <= 3) return 1 * (n - 1);
        vector<int> dp(n + 1, 0);
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 3;
        for (int i = 4; i <= n ; i++) {
            for (int j = 1; j <= i / 2; j++) {
                dp[i] = max(dp[i], dp[i - j] * dp[j]);
            }
        }
        return dp[n];
    }
};

例题:二叉搜索树

到了这里,关于动态规划例题(代码随想录学习)——持续更新的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 代码随想录 动态规划-子序列问题-子序列(连续)

    目录 674.最长连续递增序列  718.最长重复子数组 53.最大子数组和  674. 最长连续递增序列 简单 给定一个未经排序的整数数组,找到最长且  连续递增的子序列 ,并返回该序列的长度。 连续递增的子序列  可以由两个下标  l  和  r ( l r )确定,如果对于每个  l = i r ,都

    2024年04月09日
    浏览(46)
  • 代码随想录算法训练51 | 动态规划part12

    本题加了一个冷冻期,状态就多了,有点难度,大家要把各个状态分清,思路才能清晰  视频讲解: 动态规划来决定最佳时机,这次有冷冻期!| LeetCode:309.买卖股票的最佳时机含冷冻期_哔哩哔哩_bilibili 代码随想录 相对122.买卖股票的最佳时机II ,本题只需要在计算卖出操

    2024年01月18日
    浏览(50)
  • 代码随想录Day41:动态规划Part3

    讲解前: 毫无头绪 讲解后: 这道题的动态思路一开始很不容易想出来,虽然dp数组的定义如果知道是动态规划的话估摸着可以想出来那就是很straight forward dp定义:一维数组dp[i], i 代表整数的值,dp[i] 代表将整数 i 拆分的话可以获得的最大乘积 然后呢就是定义递归推导式了,

    2024年04月27日
    浏览(33)
  • 【每日刷题】动态规划-代码随想录动规-8、9

    题目链接 dp数组含义 :dp[i]表示拆分i的最大乘积 递推公式 :dp[i]= max(j*(i-j), j*dp[i-j], dp[i]) 解释:从1遍历j,有两种渠道得到dp[i]. 一个是j * (i - j) 直接相乘。 一个是j * dp[i - j],相当于是拆分(i - j) 为何不拆分j:j是从1开始遍历,拆分j的情况,在遍历j的过程中其实都计算过了

    2024年02月02日
    浏览(44)
  • Day39 代码随想录(1刷) 动态规划 0-1背包

    题目描述 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。  小明的行李空间

    2024年04月23日
    浏览(43)
  • 代码随想录 day38 第九章 动态规划part01

    ●  理论基础 ●  509. 斐波那契数 ●  70. 爬楼梯 ●  746. 使用最小花费爬楼梯 理论基础 解决动态规划必须要想清楚的点 dp数组以及下标的含义 递推公式 dp数组如何初始化 遍历顺序 打印数组 检查结果 关联 leetcode 509. 斐波那契数 思路 动规五部曲 dp数组以及下标的含义

    2024年04月17日
    浏览(39)
  • 【代码随想录】Day 49 动态规划10 (买卖股票Ⅰ、Ⅱ)

    https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/ dp[i]表示在第i天时,卖/不卖股票能获得的最大利润: 1、卖股票:dp[i] = prices[i] -minPrice(i天以前的最低价格) 2、不卖股票:dp[i] = dp[i-1](因为不卖股票,所以状态和前一天保持一致) ∴dp[i] = max(dp[i-1], prices[i] - minPrice); https

    2024年02月09日
    浏览(33)
  • 代码随想录 动态规划 判断子序列,不同的子序列

    392. 判断子序列 给定字符串  s  和  t  ,判断  s  是否为  t  的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如, \\\"ace\\\" 是 \\\"abcde\\\" 的一个子序列,而 \\\"aec\\\" 不是)。 思路: 1. 使用哈希统计两个序

    2024年02月07日
    浏览(41)
  • 【每日刷题】动态规划-代码随想录动规-11、12、13

    问题背景 : 有若干个物品对应各自的体积和价值,有一个容量确定的背包,有选择的将物品装进背包里,求可放进背包的最大价值。 思路: 定义dp数组: dp[i][j]的含义:从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少。 dp[i][j]递推公式: 不放物品

    2024年02月22日
    浏览(46)
  • 【Day52】代码随想录之动态规划_打家劫舍

    动态规划理论基础 动规五部曲: 确定dp数组 下标及dp[i] 的含义。 递推公式:比如斐波那契数列 dp[i] = dp[i-1] + dp[i-2]。 初始化dp数组。 确定遍历顺序:从前到后or其他。 打印。 出现结果不正确: 打印dp日志和自己想的一样:递推公式、初始化或者遍历顺序出错。 打印dp日志和

    2024年02月22日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包