343. 整数拆分
dp[i]: 整数i的拆分最大乘积
初始化:
dp[0], dp[1]没有意义, dp[2] = 1
public int IntegerBreak(int n) {
int[] dp = new int[n + 1];
dp[2] = 1;
for (int k = 3; k <= n; k++)
{
int max = 0;
for (int i = 1; i <= k / 2; i++)
{
if (i * (k - i) > max)
{
max = i * (k - i);
}
if(i * dp[k - i] > max)
{
max = i * dp[k - i];
}
}
dp[k] = max;
}
return dp[n];
}
- 时间复杂度O(n*n)
- 空间复杂度O(n)
96. 不同的二叉搜索树
dp[i]: 对于整数i满足题意的二叉搜索树的种数
初始化:
dp[0] = 1
public static int NumTrees(int n)
{
int[] dp = new int[n + 1];
dp[0] = 1;
for (int k = 1; k <= n; k++)
{
int result = 0;
for (int i = 0; i < k; i++)
{
result += dp[i] * dp[k - 1 - i];
}
dp[k] = result;
}
return dp[n];
}
- 时间复杂度O(n*n)
- 空间复杂度O(n)