343.Integer Break---dp

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

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

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

 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

法二(借鉴):数学方法,数学原理:https://leetcode.com/problems/integer-break/discuss/80721/Why-factor-2-or-3-The-math-behind-this-problem.,由数学知,一个整数分解,当分解成相同的数时,乘积最大,而因为给定的天然数不必定都能分解成相同的数,因此又由数学知,求导办法见http://www.javashuo.com/article/p-mohovvjr-ch.html,当分解获得的数越靠近e,获得的乘积值越大,那么也就是能取3则取3,不能则取2。而又如6=2+2+2=3+3,又2*2*2<3*3,因此当能分解成3个2时,应该换算成2个3,因此下面与3求余,而后分状况分解。代码以下(耗时0):spa

 1     public int integerBreak(int n) {
 2         if(n == 2) {
 3             return 1;
 4         }
 5         else if(n == 3) {
 6             return 2;
 7         }
 8         else if(n == 1) {
 9             return 1;
10         }
11         else if(n % 3 == 0) {
12             return (int)Math.pow(3, n / 3);
13         }
14         else if(n % 3 == 1) {
15             return 2 * 2 * (int)Math.pow(3, (n - 4) / 3);
16         }
17         else {
18             return 2 * (int)Math.pow(3, (n - 2) / 3);
19         }
20     }
View Code
相关文章
相关标签/搜索