leetcode343. 整数拆分(动态规划)

255 阅读1分钟

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积

示例 1:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

解题思路

组成整数两个数可以进一步拆分,所以可以运用到动态规划,dp[i]代表的是整数i拆分后的最大积,每次选择最初拆分成的两个整数的时候可能整数本身比整数的拆分乘积还要大,所以要取最大值

代码

class Solution {
    public int integerBreak(int n) {

        int [] dp=new int[n+1];
        Arrays.fill(dp,0);
        dp[1]=1;
        for(int i=2;i<=n;i++)
            for(int j=i-1;j>=(i-1)/2;j--)
                    dp[i]=Math.max(dp[i],Math.max(dp[j],j)*Math.max(dp[i-j],i-j)) ;
            return dp[n];

    }
}