343. 整数拆分
// 如何能确保分解出的值乘积最大?遍历i可拆分的所有结果
//1、dp[i]的含义,i被拆分为一系列数的和,这一系列数的最大乘积
//2、递推公式:dp[i] = j+dp[i-j]
//3、初始化dp[0]=0, dp[1]=0, dp[2]=1
//4、顺序:递增
//5、打印dp
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=0; j<i; j++){
dp[i] = max(j*dp[i-j], max(j*(i-j), dp[i])); //dp[i]相当于一个哨兵,始终存储外层i循环中的最大值
}
}
for (int i=0; i<=n; i++){
cout << dp[i] <<" ";
}
return dp[n];
}
};
96. 不同的二叉搜索树
//1 dp[i]含义 i个节点有多少种互不相同的二叉搜索树
//2 根据n=3推算出递推公式 dp[3]=dp[0]*dp[2] + dp[1]*dp[1] + dp[0]*dp[2]
//3 初始化,dp[0]=1
//4 因为dp[i]要根据比自己小的dp元素计算得到,所以是递增顺序
//5 打印dp
class Solution {
public:
int numTrees(int n) {
vector<int> dp(n+1);
dp[0]=1; //dp[1]=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];
}
};