LeetCode33动态规划 343. 整数拆分96.不同的二叉搜索树

343. 整数拆分
class Solution {
    public int integerBreak(int n) {
        //dp[i] 拆分i能获得的最大值
        //dp[i] = max(j * dp[i - j])
        //dp[1] = 1
        //先遍历i然后j

        int[] dp = new int[n + 1];
        dp[2] = 1;
        for(int i = 3;i <= n;i++){
            int max = 0;
            //j最大i - j
            for(int j = 1;j <= i - j;j++){
                if(j * dp[i - j] > max)max = j * dp[i - j];
                
                if(j*(i - j) > max)max = j*(i - j);//好像只有3会出现i - j > dp[i - j]
            }
            dp[i] = max;
        }
        return dp[n];
    }
}

96.不同的二叉搜索树

class Solution {
    public int numTrees(int n) {
        //dp[i] 是i个节点的搜索二叉树数量。
        //dp[j] = for(int i = 0;i < j;i++)sum += dp[i]*dp[j- i - 1];
        //dp[0] = 1;dp[1]= 1;
        //j++;
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = 1;
        for(int j = 2;j <=n;j++){
            int sum = 0;
            for(int i = 0;i < j;i++){
                sum += dp[i] * dp[j - i - 1];
            }
            dp[j] = sum;
        }
        return dp[n];
    }
}

你可能感兴趣的:(动态规划,算法)