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];
}
}