343题-整数拆分

1.1题目

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

示例:

1.2解答

这种问题一看就知道使用动态规划,子问题也很好找,将一个数分为两部分,要么两个部分都不可分了,要么一个可分,一个不可分。两个都可分的情况可以改成一个可分,一个不可分。所以我们用dp[i]记录i可分的最大值。对于数i将其分为两部分j和i-j。那么dp[i]=max(j(i-j),jdp[i-j])。j从一到i-1都试一遍,就能找到最大值啦。

1.3代码

package solution;
/**
 * @author xgj
 */
public class Solution {
    int[] dp = new int[59];
    public int integerBreak(int n) {
       for (int m = 2 ; m <= n ;++m){
           if(dp[m] == 0){
               int res = Integer.MIN_VALUE;
               for(int i = 1 ; i<m;++i){
                   res = Math.max(res,Math.max(i*(m-i),i*dp[m-i]));
               }
               dp[m] = res;
           }
       }
    return dp[n];
    }
}

猜你喜欢

转载自www.cnblogs.com/jiezao/p/13401732.html