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] + " ");
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_43269495/article/details/84144869