目录
LeetCode 343.整数拆分
文章讲解:代码随想录
视频讲解: 动态规划,本题关键在于理解递推公式!| LeetCode:343. 整数拆分_哔哩哔哩_bilibili
力扣题目:LeetCode 343.整数拆分
动态规划五步曲:
1.确定dp[i]的含义
dp[i]:正整数i的最大乘积
2.找出递推公式
dp[i] = Math.max(dp[i], Math.max(j*(i-j), j*dp[i-j]));
3.初始化dp数组
dp[2] = 1;
4.确定遍历顺序
从前往后
5.举例dp数组
代码如下(Java):
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; j++){
dp[i] = Math.max(dp[i], Math.max(j*(i-j), j*dp[i-j]));
}
}
return dp[n];
}
}
LeetCode 96.不同的二叉搜索树
文章讲解:代码随想录
视频讲解:动态规划找到子状态之间的关系很重要!| LeetCode:96.不同的二叉搜索树_哔哩哔哩_bilibili
力扣题目:LeetCode 96.不同的二叉搜索树
动态规划五步曲:
1.确定dp[i]的含义
dp[i]:有dp[i]种互不相同的二叉搜索树
2.找出递推公式
dp[i] += dp[j-1] * dp[i-j];
3.初始化dp数组
dp[0] = 1;
4.确定遍历顺序
从前往后遍历
5.举例dp数组
代码如下(Java):
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];
}
}