首页 > 其他分享 >Day34 动态规划Part2

Day34 动态规划Part2

时间:2024-08-19 11:37:53浏览次数:11  
标签:obstacleGrid return int Day34 Part2 range 动态 节点 dp

目录

任务

62. 不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

思路

经典的DP问题,注意返回值和遍历区间。dp[i][j]表示按照规则到达i,j这个格子的方法数

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[0] * n for i in range(m)]
        
        for j in range(n):
            dp[0][j] = 1
        for i in range(m):
            dp[i][0] = 1
        for i in range(1,m):
            for j in range(1,n):
                dp[i][j] = dp[i-1][j]+ dp[i][j-1]

        return dp[m-1][n-1]

63. 不同路径 II

思路

与上题基本一致,加了障碍即障碍的格子无法到达,方法数为0,此外初始化时,一旦发现了障碍的格子,则遍历第一行(列)时,其后的格子均无法到达

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m = len(obstacleGrid)
        n = len(obstacleGrid[0]) if m>0 else 0
        dp = [[0] * n for i in range(m)]
        
        for j in range(n):
            if obstacleGrid[0][j] == 1:
                break
            dp[0][j] = 1
        for i in range(m):
            if obstacleGrid[i][0] == 1:
                break
            dp[i][0] = 1
        for i in range(1,m):
            for j in range(1,n):
                if obstacleGrid[i][j] == 1:
                    dp[i][j] = 0
                else:
                    dp[i][j] = dp[i-1][j]+ dp[i][j-1]

        return dp[m-1][n-1]

343. 整数拆分

给定一个正整数 n ,将其拆分为 k 个 正整数 的和( k >= 2 ),并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。

思路

dp[i]表示将i拆分成k个正整数(k>=2)并使得乘积最大的乘积值,整体上它有两种取法(实际可以细分),一种是拆成2个数,则结果为j (i-j) ( 实际上拆成两个数也有很多取法,j从1取到i,可剪枝),一种是拆成3个及以上的数,即结果为 jdp[i-j]。然后从中取最大的,由于实际细分(不管是拆成两个数还是拆成更多的数)有很多取法(结合遍历),所以max要在遍历中取最大,即要和dp[i]比较,来保证是遍历中最大的数。

class Solution:
    def integerBreak(self, n: int) -> int:
        dp = [0] * (n+1)
        dp[2] = 1
        for i in range(3,n+1):
            #for j in range(1,i):
            for j in range(1,i//2 +1):
                dp[i] = max(dp[i],max((j*(i-j)),j*dp[i-j]))
        return dp[n]

96. 不同的二叉搜索树

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

思路

dp[i]表示 有i个节点的二叉搜索树构成一共有的种数,它是 左子树的种数 * 右子树的种数累计起来的。
如,当i = 3, 它是左子树为0个节点,右子树为2个节点 的种类,加上左右子树都是一个节点的种类 + 左子树2个节点,右子树0个节点的种类,即
dp[3] = dp[0]dp[2]+dp[1]dp[1] + dp[2]*dp[0]
因此,通用的,用j表示左子树节点的个数,它最小是0,最大是i-1(因为根占掉一个节点),那么右子树节点的个数就是i-j-1。

class Solution:
    def numTrees(self, n: int) -> int:
        if n == 1:  return 1
        dp = [0] * (n+1)
        dp[0] = 1
        dp[1] = 1
        
        for i in range(2,n+1):
            for j in range(0,i):
                dp[i] += dp[j] * dp[i-j-1]
        return dp[n]

标签:obstacleGrid,return,int,Day34,Part2,range,动态,节点,dp
From: https://www.cnblogs.com/haohaoscnblogs/p/18367014

相关文章

  • 【JavaSec】类的动态加载初探
    0x02类的动态加载文章目录0x02类的动态加载什么是类加载?动态类加载方法:类加载:继承关系:调用关系:下面尝试使用URLClassLoader进行尝试http协议:jar协议:http读取方法:file读取方法:使用defineClass类加载方法Unsafe类加载什么是类加载?即虚拟机加载.class文件在......
  • 代码随想录day34 || 62 不同路径,63 不同路径||,343整数拆分,96 不同搜索二叉树
    不同路径funcuniquePaths(mint,nint)int{ //dp五部曲 //dp数组以及下标的含义dp[i][j]代表从0,0走到i,j的不同路径条数 //递推公式 dp[i][j]=dp[i-1][j]+dp[i][j-1] //dp数组的初始化dp[i][0]==dp[0][j]=1 //遍历顺序 外层按照行,内层按照列遍历......
  • visual studio当中动态库和静态库的联系
    一、为什么要写这篇博客公司需要调用MNN框架编译之后的动态库和静态库文件来在另外一台没有编译过MNN框架上的机器运行对应的程序,比如说人体关键点检测之类的程序,这个时候了解静态库和动态库的关系就很有必要了。二、现代编译器编译流程源代码(sourcecode)→预处理器(preprocess......
  • 动态规划 总结
    DAG上的动态规划与树形DP这两个词看上去很高大上,但实则就是记忆化搜索,而记忆化搜索其实就是DP的本质。当选择一个需要用全局变量来参与描述状态的方式时,就只能用常规搜索。但当状态可以完全被几个非全局参数确定性的描述时,就可以用记忆化搜索,记忆化搜索可以通过存储答案并直接提取......
  • 动态创建表
    部分场景需要动态创建表,例如根据用户输入的表名动态创建。动态创建表可以使用xml方式来实现,具体步骤如下:1、service层:中调用mapper里的createTable方法itemMapper.createItemTable(tableName,VARCHAR_256);2、DAO层:mapper中写具体的创建方法createItemTable@Mapper......
  • 【代码随想录训练营第42期 Day32打卡 - 从零开始动态规划 - LeetCode 509. 斐波那契数
    目录一、做题心得二、动规五步走三、题目与题解题目一:509.斐波那契数题目链接题解1:记忆性递归 题解2:动态规划题目二:70.爬楼梯 题目链接题解:动态规划题目三:746.使用最小花费爬楼梯题目链接题解:动态规划三、小结一、做题心得今天开始动态规划章节的第一......
  • Mybatis学习日记-day7-动态sql
    一、学习目标        在之前的学习中,使用的都是静态sql,而动态SQL相比静态SQL具有多个显著的优点。    首先。,动态SQL允许根据程序运行时的条件和需求来动态地生成SQL语句。这意味着它可以根据不同的情境和需求生成不同的SQL语句,从而提供更高的灵活性和适应......
  • P10660 BZOJ2759 一个动态树好题 题解
    从题目名字看出此题需要用动态树解决对于任意\(i\),都有唯一的\(p_i\)与之对应,由\(p_i\)向\(i\)连边,\(n\)种关系显然构成一基环树森林。对于环上的节点,一个点可以自己表示自己,所以可以直接解出该点的权值,其他点从环上的点直接推出即可。考虑如何动态维护这个过程,一个点上......
  • (nice!!!)LeetCode 552. 学生出勤记录 II(动态规划dp递归版、记忆化dfs)
    题目:552.学生出勤记录II思路:记忆化搜索dfs,细节看注释classSolution{public:constintmod=1e9+7;//状态f[u][a][b]表示:在选择第u个位置前,缺勤次数为a次,且当前连续迟到次数为b次时,可以得到的合法出勤次数intf[100010][5][5];intdfs(intu,int......
  • 【JavaSec】JDK动态代理初探
    JDK动态代理初探文章目录JDK动态代理初探静态代理动态代理静态代理用户接口:publicinterfaceIUser{voidshow();voidcreate();voidupdate();}用户实现类:/***实现类*/publicclassUserImplimplementsIUser{publicUserI......