代码随想录算法训练营第41天(第40天周日休息) | 动态规划 LeetCode343.整数拆分,96.不同的二叉搜索树

@代码随想录算法训练营第41天(第40天周日休息) | 动态规划 LeetCode343.整数拆分,96.不同的二叉搜索树

343.整数拆分

第一遍读题思考

dp数组就是每个数的拆分结果,重点在于初始化。

代码随想录解法思路

一样。

c++代码具体实现注意事项

需要注意dp的递推公式,计算5的最大乘积的时候,用j拆分成j和5-j,为什么j不再拆分了?
代码随想录算法训练营第41天(第40天周日休息) | 动态规划 LeetCode343.整数拆分,96.不同的二叉搜索树_第1张图片

class Solution {
public:
    int integerBreak(int n) {
        vector<int> dp(n+1);
        dp[2] = 1; // 2:1
        if(n<=2) return 1;
        for(int i=3;i<=n;i++)
            for(int j=1;j<=i/2;j++){
                dp[i] = max(dp[i], max((i-j)*j, dp[i-j]*j));
            }
        return dp[n];

    }
};

96.不同的二叉搜索树

第一遍读题思考

dp数组仍然表示n的时候有多少种二叉搜索树,注意是二叉搜索树。递推公式可以把n等于1234的情况写出来找规律。

代码随想录解法思路

差不多

c++代码具体实现注意事项

class Solution {
public:
    int numTrees(int n) {
        vector<int> dp(n+1);
        if(n==1) return 1;
        dp[0]=1;
        dp[1]=1;
        dp[2]=2;
        for(int i=3;i<=n;i++)
            for(int j=1;j<=i;j++)
            {
                dp[i] += dp[j-1]*dp[i-j];
            }
        return dp[n];
    }
};

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