dp[i]
为数i的最大整数拆分,则F(n)=max{i∗F(n−i)},i=1,2,...,n−1
,上述表达式是表明n - i需要继续分解的情况,但如果n - i比F(n - i)要大,显然就不用再继续分解了。故我们还需要比较i * (n - i)与i * F(n - i)的大小关系。所以完整的表达式应该为:F(n)=max{i∗F(n−i), i∗(n−i)},i=1,2,...,n−1
package BDyNamicProgramming;
import DString.Problem3;
/**
* @Author Zhou jian
* @Date 2020 ${month} 2020/4/22 0022 18:26
* 整数拆分
* 给定一个正整数 n,
* 将其拆分为至少两个正整数的和,
* 并使这些整数的乘积最大化。
* 返回你可以获得的最大乘积。
*/
public class Problem343 {
/**
*
* @param n
* @return
* dp[i]为数据i的最大整数拆分的乘积
* dp[i]=max(dp[i-1]*1 dp[i-2]*2 dp[i-3]*3 dp[i-3]* )拆分出来一个数* j
*/
public int integerBreak(int n) {
if(n==0) return 0;
if(n==1) return 0;
if(n==2) return 1;
int[] dp= new int[n+1];
dp[0]=dp[1]=0;
dp[2]=1;
for(int i=3;i<=n;i++){
//从i里拆j出来
for(int j=1;j<i;j++){
dp[i]=Math.max(Math.max(dp[i-j]*j,dp[i]),j*(i-j));
}
}
return dp[n];
}
public static void main(String[] args) {
Problem343 problem343 = new Problem343();
problem343.integerBreak(10);
}
}
`