动态规划 08

109 阅读1分钟

LeetCode 343

leetcode-cn.com/problems/in…

解题思路

设一维数组dp,其值含义表示 正整数i拆分为至少两个正整数,其乘积最大的积。

其中 2 <= i <= n,假设拆分成两份,1 <= j < i,拆分成 j 和i - j 两部分

  1. i-j 不继续拆分,所以最大的积是j * (i - j)
  1. i-j 继续拆分,所以最大的积是j * dp[i - j]

所以递推公式就是 dp[i] = max(j * (i - j), j * dp[i - j])

代码如下

class Solution {
    public int integerBreak(int n) {
        int[] dp = new int[n + 1];
        for (int i = 2; i <= n; i++) {
            int curMax = 0;
            for (int j = 1; j < i; j++) {
                curMax = Math.max(curMax, Math.max(j * (i - j), j * dp[i - j]));
            }
            dp[i] = curMax;
        }  
        return dp[n];
    }
}