当前位置: 首页 > 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]。
http://www.lryc.cn/news/443179.html

相关文章:

  • 乐观锁、悲观锁
  • Java客户端SpringDataRedis(RedisTemplate使用)
  • wsl2桥接网络 ubuntu到弃坑到又跳坑
  • WIFI路由器的套杆天线简谈
  • 希尔排序(C语言实现)
  • LLVM 中的Value、User、Use设计
  • C++智能指针入门教程(C++11)
  • 常用工具推荐!分享7款AI论文修改软件工具网站
  • 怎么解除BitLocker对磁盘的加密?
  • 群晖使用Docker部署WPS Office并实现异地使用浏览器制作办公文档
  • Unity3d 以鼠标位置点为中心缩放视角(正交模式下)
  • Git清除某文件所有历史提交记录
  • jacoco生成单元测试覆盖率报告
  • 【CSS Tricks】如何做一个粒子效果的logo
  • 如何使用ssm实现基于Javaweb的网上花店系统的设计与实现
  • Elastic 的 OpenTelemetry PHP 发行版简介
  • TCP 和 UDP 协议的区别?
  • 【PHP】使用thinkphp5查询最大值时,把varchar类型字段转换成数字
  • Java 正则表达式详解
  • MySQL篇(窗口函数/公用表达式(CTE))(持续更新迭代)
  • Jira Cloud涨价5%-20%,钉钉项目Teambition成优选替代
  • Python语言基础教程(下)4.0
  • 【HTTP】构造HTTP请求和状态码
  • Delta Lake如何使用
  • 面试题 - parallelStream() 有什么缺点 - ForkJoinPool,它和传统的线程池(如 ThreadPoolExecutor)的区别
  • 切换淘宝最新镜像源npm详细讲解
  • STM32F407单片机编程入门(十二) FreeRTOS实时操作系统详解及实战含源码
  • 网络安全-利用 Apache Mod CGI
  • ACE之ACE_Reactor_Notify
  • 【小沐学GIS】blender导入OpenStreetMap城市建筑(blender-osm、blosm)