代码随想录-2023/08/07
动态规划
343.整数拆分
解题思路:
- 定义
dp
数组含义,dp[i]
代表数字i
的拆分最大乘积和 - 假设一个数字
i
拆成j
, 那么另外一半就是i-j
, 这是拆成两个数字的情况 - 拆成更多个就是
j * dp[i-j]
,dp[i-j]
就代表了拆分更多个的情况
代码:
class Solution {
public int integerBreak(int n) {
// 动态规划 --- dp[i] 代表拆分i能获得的最大乘积
int[] dp = new int[n 1];
dp[1] = 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]));
}
System.out.println(dp[i]);
}
return dp[n];
}
}
96.不同的二叉搜索树
动态规划
- 定义
dp
数组含义:dp[i]
代表了i
个节点时不同二叉搜索树的数量 - 假设
n == 5
, 因为根节点占了一个,所以此时的不同二叉树数量就对于根节点1->5
的情况 - 对于
j
从1 -> 5
, 就代表了当根节点为1, 2, 3, 4, 5
的情况j == 1:
代表根节点值为1
, 此时左子树有0
个, 右子树有4
个, 数量为dp[0] * dp[4]
j == 2:
代表根节点值为2
, 此时左子树有1
个, 右子树有3
个, 数量为dp[1] * dp[3]
j == 3:
代表根节点值为3
, 此时左子树有2
个, 右子树有2
个, 数量为dp[2] * dp[2]
j == 4:
代表根节点值为4
, 此时左子树有3
个, 右子树有1
个, 数量为dp[3] * dp[1]
j == 5:
代表根节点值为5
, 此时左子树有4
个, 右子树有0
个, 数量为dp[4] * dp[0]
- 对于
5
来说, 其所构成的不同二叉搜索树数量就是这些情况的总和, 即
dp[5]=dp[0]∗dp[4] dp[1]∗dp[3] dp[2]∗dp[2] dp[3]∗dp[1] dp[4]∗dp[0]dp[5] = dp[0] * dp[4] dp[1] * dp[3] dp[2] * dp[2] dp[3] * dp[1] dp[4] * dp[0]
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgbacce
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01