Day40题目
LeetCode343.整数拆分
核心思想:递推公式比较难想,dp[i]表示值为i时的最大,每新增一个元素,就计算后面分几个元素是最大的
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-1 ; j ++){
// 这里dp[i-j]*j 计算的是 后面分j个数,那么前i-j的最大值是dp[i-j],不管他怎么分
// (i-j)*j指的是只分成两个数
// 还要不断更新dp[i],所以max中也比较dp[i]
dp[i] = Math.max(dp[i],Math.max(dp[i-j]*j,(i-j)*j));
}
}
return dp[n];
}
}
LeetCode96.不同的二叉搜索树
核心思想:dp[i]表示i个节点的不同二叉搜索树的数量,然后i个节点,比如三个,有三种情况,3为头节点:左2右0,1为头节点:左0右2,2为头节点:左一右一.那么dp[i]就等于这三种情况之和,每种情况的种数是dp[左]*dp[右]
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 ++){
// 左i-j 右 j-1
dp[i] += dp[i-j]*dp[j-1];
}
}
return dp[n];
}
}
352



被折叠的 条评论
为什么被折叠?



