提示
文章目录
一、整数拆分
对整数进行拆分,有两种方法得到dp[i],一种是j * (i-j),另外一种是j * dp[i-j],第二种方法相当于再次将i-j拆分,所以dp[i]需要取两者的最大值,同时j也是从1开始拆分的,i里面有小循环j,所以也要比较dp[i],取最大值。
cpp
class Solution {
public:
int integerBreak(int n) {
//1.确定dp数组和下标含义
vector<int>dp(n+1);
//2.确定递推公式
//3.dp初始化
dp[2] = 1;
//4.遍历顺序
for (int i = 3; i <= n; i++) {
for (int j = 1; j <= i/2; j++) {
dp[i] = max (dp[i], max(dp[i-j] * j, (i-j) * j));
}
}
return dp[n];
}
};
二、不同的二叉搜索树
有点难理解,主要还是找递推关系,建立递推公式
cpp
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n + 1);
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];
}
};
总结
欠的补完了,之后再忙也要抽出时间多看多写
学习时间90min。
学习资料:《代码随想录》。