從物理學到計算機,再到硬件,再到人工智能!
藍橋杯備賽 (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] + " ");
}
}
}