当前位置: 首页 > news >正文

代码随想录训练营第34天|dp前置转移

62. 不同路径

class Solution {
public:int uniquePaths(int m, int n) {vector<vector<int>> dp(m,vector<int>(n,1));for(int i=1; i<m;i++){for(int j=1; j<n; j++){dp[i][j]=dp[i-1][j]+dp[i][j-1];}}return dp[m-1][n-1];}
};

dp[i][j]:运动至(i,j)的方案数

转移方程:可由上/左两个方向转移而来,累加不同的方案数。

63. 不同路径 II

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

dp[i][j]:运动至(i,j)的方案数

转移方程:

  • 没有障碍物的情况下,可以由上或左两个方向转移而来;
  • 有障碍物的情况只能取0,表示没有方案,不可达。

343. 整数拆分

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

dp[i]:拆分i可以达到的最大乘积

转移方程:给定i,可能由任何一个前置的j拆分而来,对于剩下的部分(i-j)由两种选择:

  • 1.不拆,此时拆分乘积为 (i-j)*j
  • 2.拆,此时拆分乘积为 dp[i-j]*j

根据dp的定义对二者取最大。

另外,dp[1]初始化为0,表示拆分1的情况是非法的,这样取max后自然被过滤掉。

96. 不同的二叉搜索树

class Solution {
public:int numTrees(int n) {vector<int> dp(n+1,0);dp[0]=1;for(int i=1; i<=n; i++){for(int j=1; j<=i; j++){dp[i]+=dp[j-1]*dp[i-j];}}return dp[n];}
};

dp[i]:给定节点数i,可构造的搜索树数目

转移方程:给定节点数i,搜索树的根可以取前置任一节点:1、2……i,dp[i]累加不同情况而来。选定j(j<=i)作为根:

  • 左子树节点数为:j-1,左子树的形态数目:dp[j-1]。
  • 右子树节点数为:i-(j+1)+1,形态数:dp[i-j],不需要关注每个节点具体数值的差异。
  • 根据乘法原理,由左右子树个数得到整个树的形态数:dp[j-1]*dp[i-j]。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++ Primer Plus习题】16.3
  • PHP:强大的Web开发语言
  • 基于微信小程序的高校实验室管理系统的设计与实现
  • 数据结构之外部排序
  • ros学习笔记.4 Path Planning Part 2 (避障)
  • 【Linux基础】冯诺依曼体系结构操作系统的理解
  • 1.接口测试基础
  • 测试用例的了解
  • 【设计模式】创建型模式(四):建造者模式
  • Python中的魔法:探索自定义Context Manager的魅力
  • 7天速成前端 ------学习日志 (继苍穹外卖之后)
  • Eclipse折叠if、else、try catch的{}
  • leetcode01——27. 移除元素(双指针)、977. 有序数组的平方(双指针)、209. 长度最小的子数组(双指针/滑动窗口)
  • leetcode刷题day17|二叉树Part05(654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树)
  • MySQL:索引02——使用索引
  • 收藏网友的 源程序下载网
  • [译]CSS 居中(Center)方法大合集
  • Mysql数据库的条件查询语句
  • Object.assign方法不能实现深复制
  • php中curl和soap方式请求服务超时问题
  • React Transition Group -- Transition 组件
  • Vue UI框架库开发介绍
  • windows-nginx-https-本地配置
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 反思总结然后整装待发
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 浅谈Golang中select的用法
  • 移动端 h5开发相关内容总结(三)
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • (a /b)*c的值
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (汇总)os模块以及shutil模块对文件的操作
  • (每日持续更新)jdk api之FileReader基础、应用、实战
  • (七)理解angular中的module和injector,即依赖注入
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .Net Attribute详解(上)-Attribute本质以及一个简单示例
  • .NET Core Web APi类库如何内嵌运行?
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .net开发时的诡异问题,button的onclick事件无效
  • /etc/motd and /etc/issue
  • @cacheable 是否缓存成功_Spring Cache缓存注解
  • @RestControllerAdvice异常统一处理类失效原因
  • @SuppressWarnings注解
  • [2021 蓝帽杯] One Pointer PHP
  • [Android]一个简单使用Handler做Timer的例子
  • [AX]AX2012 SSRS报表Drill through action
  • [BZOJ3211]:花神游历各国(小清新线段树)
  • [C++]二叉搜索树
  • [CDOJ 1343] 卿学姐失恋了
  • [ESP32] 编码旋钮驱动
  • [HackMyVM]靶场Crossbow