代码随想录训练营第41天|343.整数拆分,96.不同的二叉搜索树

代码随想录训练营第41天|343.整数拆分,96.不同的二叉搜索树

  • 343.整数拆分
    • 文章
    • 思路
    • 代码
  • 96.不同的二叉搜索树
    • 文章
    • 思路
    • 代码
  • 总结

343.整数拆分

文章

代码随想录|0343.整数拆分

思路

二刷不难
d p [ i ] = M a x j ( m a x ( j + 1 , d p [ j ] ) ∗ ( i − j ) ) \begin{equation} dp[i]=Max_j(max(j + 1, dp[j]) * (i - j)) \end{equation} dp[i]=Maxj(max(j+1,dp[j])(ij))

代码

class Solution {
    public int integerBreak(int n) {
        int[] dp = new int[n];
        int i, j;
        int prefix;
        for (i = 1; i < n; ++i) {
            for (j = 0; j < i; ++j) {
                dp[i] = Math.max(dp[i], Math.max(j + 1, dp[j]) * (i - j));
            }
        }
        // for (i = 0; i < n; ++i) {
        //     System.out.print(" " + dp[i]);
        // }
        return dp[n - 1];
    }
}

96.不同的二叉搜索树

文章

代码随想录|0096.不同的二叉搜索树

思路

二刷不难
二叉搜索树的数量等于左子树的数量乘右子树的数量
其组合有(0, n - 1), … (n - 1, 0)共n种
d p [ i ] = ∑ j < i d p [ j ] ∗ d p [ i − 1 − j ] dp[i] = \sum_{jdp[i]=j<idp[j]dp[i1j]

代码

class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n + 1];
        int i, j;
        dp[0] = 1;
        for (i = 1; i < n + 1; ++i) {
            for (j = 0; j < i; ++j) {
                dp[i] += dp[j] * dp[i - 1 - j];
            }
        }
        return dp[n];
    }
}

总结

二刷就乏善可陈

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