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

算法笔记|Day29动态规划II

算法笔记|Day29动态规划II

  • ☆☆☆☆☆leetcode 62.不同路径
    • 题目分析
    • 代码
  • ☆☆☆☆☆leetcode 63. 不同路径II
    • 题目分析
    • 代码
  • ☆☆☆☆☆leetcode 343. 整数拆分
    • 题目分析
    • 代码
  • ☆☆☆☆☆leetcode 96.不同的二叉搜索树
    • 题目分析
    • 代码

☆☆☆☆☆leetcode 62.不同路径

题目链接:leetcode 62.不同路径

题目分析

1.dp数组含义:dp[i][j]表示到达[i,j]位置的路径数量;
2.递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1](仅能向右或者向下走一步,那到达每个格子的路径数量为到达左一格和上一格路径数量的和);
3.初始化:dp[][1]=1,dp[1][]=1(即第一行和第一列仅有一种路径,赋初值为1);
4.遍历顺序:从左向右,从上向下。

代码

class Solution {public int uniquePaths(int m, int n) {int dp[][]=new int[m][n];for(int i=0;i<m;i++)dp[i][0]=1;for(int j=0;j<n;j++)dp[0][j]=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];}
}

☆☆☆☆☆leetcode 63. 不同路径II

题目链接:leetcode 63. 不同路径II

题目分析

1.dp数组含义:dp[i][j]表示到达[i,j]位置的路径数量;
2.递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1](若该位置无障碍,仅能向右或者向下走一步,那到达每个格子的路径数量为到达左一格和上一格路径数量的和);
3.初始化:dp[][1]=1,dp[1][]=1(若该位置无障碍,第一行和第一列仅有一种路径,赋初值为1);
4.遍历顺序:从左向右,从上向下。

代码

class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int m=obstacleGrid.length;int n=obstacleGrid[0].length;int dp[][]=new int[m][n];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;for(int i=1;i<m;i++){for(int j=1;j<n;j++){if(obstacleGrid[i][j]==0)dp[i][j]=dp[i-1][j]+dp[i][j-1];}}return dp[m-1][n-1];}
}

☆☆☆☆☆leetcode 343. 整数拆分

题目链接:leetcode 343. 整数拆分

题目分析

1.dp数组含义:dp[i]为整数i可拆分的最大结果;
2.递推公式:dp[i]=Math.max(dp[i],Math.max(j*(i-j),jdp[i-j]))(考虑如何可以得到整数i的拆分,可以从1遍历j,通过j(i-j)直接相乘或者j*dp[i-j],相当于是拆分(i-j),取其最大值并于当前dp[i]比较后取更大的值作为dp[i]);
3.初始化:dp[2]=1(2可以拆分为1+1,其乘积为1);
4.遍历顺序:从前向后。

代码

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

☆☆☆☆☆leetcode 96.不同的二叉搜索树

题目链接:leetcode 96.不同的二叉搜索树

题目分析

1.dp数组含义:dp[i]表示由i个节点组成且节点值从1到i互不相同的二叉搜索树的种类数;
2.递推公式:dp[i]=dp[0]*dp[i-1]+dp[1]*dp[i-2]+……+dp[i-2]*dp[1]+dp[i-1]*dp[0](对于第i个节点,需要考虑1作为根节点直到i作为根节点的情况,所以需要累加,对于根节点j时,左子树的节点个数为j-1,右子树的节点个数为i-j);
3.初始化:dp[0]=1(空节点也视作一种情况);
4.遍历顺序:从前向后。

代码

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于x86 平台opencv的图像采集和seetaface6的人脸特征点功能
  • NextJs - 服务端/客户端组件之架构多样性设计
  • function call使用基础
  • 手把手教你手写单例,六种实现方式一网打尽!
  • 【MySQL进阶之路】oracle 9i的经典测试雇员信息表案例——多表查询
  • WPF Mvvm
  • MySQL集群+Keepalived实现高可用部署
  • Hooks 「 useImperativeHandle 」子组件向父组件暴露方法
  • Dockerfile常用指令详解
  • 在NVIDIA jetson中使用jetson-ffmpeg调用硬件编解码加速处理
  • TCP的连接建立及报文段首部格式
  • ESP32-IDF 在 Ubuntu 下的配置
  • 【xilinx】Vivado 成功运行Ubuntu需要哪些 文件?
  • 微软RDL远程代码执行超高危漏洞(CVE-2024-38077)漏洞检测排查方式
  • JavaSE基础(12)——文件、递归、IO流
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【5+】跨webview多页面 触发事件(二)
  • 【刷算法】从上往下打印二叉树
  •  D - 粉碎叛乱F - 其他起义
  • EventListener原理
  • extjs4学习之配置
  • React-生命周期杂记
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 闭包--闭包之tab栏切换(四)
  • 近期前端发展计划
  • 实现简单的正则表达式引擎
  • 我与Jetbrains的这些年
  • 硬币翻转问题,区间操作
  • 用jQuery怎么做到前后端分离
  • 从如何停掉 Promise 链说起
  • 我们雇佣了一只大猴子...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # 飞书APP集成平台-数字化落地
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (11)MATLAB PCA+SVM 人脸识别
  • (C语言)fgets与fputs函数详解
  • (Git) gitignore基础使用
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (二)c52学习之旅-简单了解单片机
  • (离散数学)逻辑连接词
  • (四)图像的%2线性拉伸
  • (转)jdk与jre的区别
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .net 7和core版 SignalR
  • .NET BackgroundWorker
  • .Net Core 微服务之Consul(三)-KV存储分布式锁
  • .NET 除了用 Task 之外,如何自己写一个可以 await 的对象?
  • .net 微服务 服务保护 自动重试 Polly
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @Import注解详解
  • [ CTF ] WriteUp-2022年春秋杯网络安全联赛-冬季赛
  • [000-01-022].第03节:RabbitMQ环境搭建