leetcode

343.整数拆分

力扣链接

动规五部曲

  1. 确定用作状态转移的dp数组的下标及含义 拆分i后最大的乘积是dp[i],i<=n
  2. 动规核心 状态转移方程/递推公式 遍历<=n的所有整数i, 把i拆分成两个数j和n-j 取最大值max(j* dp[i-j], j*(i-j), dp[i])
  3. dp数组如何初始化 dp[0] = 0,dp[1]=0, dp[2] =1
  4. 确定遍历顺序 从前向后遍历<=n的所有整数i
  5. 打印dp数组用于排错
class Solution {
public:
    int integerBreak(int n) {
        std::vector<int> dp(n+1);
        dp[0]=0, dp[1]=0,dp[2]=1;
        //i   4
        //j   1 2 3    j<i优化成j<=i/2
        //i-j 3 2 1
        for (int i=3; i<=n;i++)
            for (int j=1;j<=i/2;j++)
                // 等价dp[i]=std::max({j*dp[i-j], j*(i-j),dp[i]});
                dp[i] = std::max(dp[i],std::max(j*dp[i-j], j*(i-j)));
        return dp[n];
    }
};