1284. 整數拆分

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章