从物理学到计算机,再到硬件,再到人工智能!
蓝桥杯备赛 (LintCode上刷的第十三题)
由于最近考试,很多东西都来不及更新都是最近才更新的!
You have to be equivalent to what you want to do!
问题描述
给定一个正整数 n ,将其拆分成至少两个正整数之和,并且使这些整数之积最大。返回这个最大乘积。
你可以认为 n 不小于 2 ,并且不大于 58!
样例输出
给定 n = 2,返回 1 (2 = 1 + 1);给定 n = 10,返回 36 (10 = 3 + 3 + 4)。
JAVA代码实现
package DP;
public class IntegerBreak1284_1116 {
/**
* 最大乘积:将正整数拆分成至少两个正整数之和,使这些整数之积最大
* 从小的整数着手,然后不断在之前的结果基础上,对整数进行拆分,求得其因子的最大值
* @param n 一个待拆分的正整数
* @return
*/
public static int[] integerBreak(int n) {
//dp[i]表示整数i拆分之后的最大乘积
int[] dp = new int[n + 1];
dp[1] = 1;
//创建变量max记录每一个i的因子的最大乘积
int max = 0;
//遍历小于n的所有整数的拆分情况
for (int i = 2; i < dp.length; i ++) {
//遍历所有能组成i的整数因子的最大乘积
for (int j = 1; j < i; j ++) {
//整数i的因子的最大乘积为其因子的最大乘积和本身中的最大值×其另一个因子的最大乘积和本身中的最大值
dp[i] = Math.max(dp[j], j) * Math.max(dp[i - j], i - j);
//用max记录遍历过程中的最大值
if (max < dp[i]) {
max = dp[i];
}
//将最大值赋给dp[i]
dp[i] = max;
}
}
return dp;
}
public static void main(String[] args) {
int n = 10;
int[] res = integerBreak(n);
for (int i = 1; i < res.length; i++) {
System.out.print(res[i] + " ");
}
}
}