题目链接:https://leetcode.com/problems/integer-break/description/

题目大意:给定一个自然数,将其分解,对其分解的数作乘积,找出最大的乘积结果。例子如下:

343.Integer Break---dp

法一(借鉴):dp,一维dp,dp[i]表示i的最大分解结果的乘积,而dp[5]可以dp[4],dp[3],dp[2],dp[1]为基础,dp[4]可以dp[3],dp[2],dp[1]为基础,代码如下(耗时1ms):

 1     //dp[i]表示给定i分解后能得到的最大乘积值
 2     public int integerBreak(int n) {
 3         int dp[] = new int[n + 1];
 4         dp[1] = 1;
 5         dp[2] = 1;
 6         for(int i = 3; i <= n; i++) {
 7             for(int j = 1; j <= i / 2; j++) {
 8                 //max里面要加上dp[i],因为里层for循环会不断更新dp[i],否则dp[i]得到就是最后一次的计算结果,而取不到最大值
 9                 //后面Math.max(j, dp[j]) * Math.max(i - j, dp[i - j]),因为j+(i-j)=i,所以计算j和i-j的乘积,是正常的,只不过这里可以用到先前已经算过的dp[j]和dp[i-j],因为dp[j]的结果就是j的最大分解结果,那么也可以是i的分解结果
10                 dp[i] = Math.max(dp[i], Math.max(j, dp[j]) * Math.max(i - j, dp[i - j]));
11             }
12         }
13         return dp[n];
14     }
View Code

相关文章:

  • 2022-12-23
  • 2021-05-20
  • 2022-12-23
  • 2021-09-01
  • 2021-11-12
  • 2021-11-24
  • 2022-12-23
猜你喜欢
  • 2021-11-18
  • 2021-12-11
  • 2021-07-30
  • 2022-12-23
  • 2021-06-21
相关资源
相似解决方案