拆分整数
dp[i]的含义:把i拆分后,可以得到的最大乘积。
递推: j * (i - j) j * dp[i - j] he
int integerBreak(int n) {
vector<int> result (n + 1);
result[0] = 0;
result[1] = 0;
result[2] = 1;
for(int i = 3; i < result.size(); i++){
for(int j = 1; j < i; j++){
result[i] = max(j * result[i - j], max(j * (i - j), result[i]));
}
}
return result[n];
}
不同的二叉搜索树
dp[i] 表示 个数为 i 的树中,有多少不同的二叉搜索树
递推:分别取第i个作为根节点,i左右两边的数量乘积
int numTrees(int n) {
vector<int> dp (n + 1);
dp[0] = 0;
dp[1] = 1;
for(int i = 2; i < dp.size(); i++){
int sum = dp[i - 1];
for(int j = 2; j < i; j++){
sum += dp[j - 1] * dp[i - j];
}
sum += dp[i - 1];
dp[i] = sum;
}
return dp[n];
}