博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
leetcode343
阅读量:6097 次
发布时间:2019-06-20

本文共 2148 字,大约阅读时间需要 7 分钟。

1 public class Solution 2     { 3         public int IntegerBreak(int n) 4         { 5             if (n == 2) 6             { 7                 return 1; 8             } 9             else if (n == 3)10             {11                 return 2;12             }13             var max = int.MinValue;14             for (int i = 2; i <= n / 2; i++)15             {16                 var div = n / i;17                 var mod = n % i;18                 var cur = 0;19                 if (mod == 0)20                 {21                     cur = Convert.ToInt32(Math.Pow(i, div));22                 }23                 else24                 {25                     var cur1 = Convert.ToInt32(Math.Pow(i, div - 1) * (i + mod));26                     var cur2 = Convert.ToInt32(Math.Pow(i, div)) * mod;27                     cur = Math.Max(cur1, cur2);28                 }29                 if (cur > max)30                 {31                     max = cur;32                 }33                 else34                 {35                     break;36                 }37             }38             return max;39         }40     }

 

这道题的解题思路是,从2到n/2每个值依次进行尝试,对于每一个值,计算这种情况下的因子乘积,

如果是可以被整除,则计算当前值的“倍数的次方”;如果不能被整除,则分两种情况分别计算。

第一种是:将某一个因子与余数合并为一个因子。

第二种是:剩余的余数做一个单独的因子。

每种情况都计算出其因子的乘积,然后找最大值。

举例来说,输入参数n=12,

i=2,执行21行,cur=2^6=64,更新max=64

i=3,执行21行,cur=3^4=81,更新max=81

i=4,执行21行,cur=4^3=64,保持max=81

i=5,执行25~27,cur1=5^(2-1) * (5+2)=5*7=35,cur2=5^2 * 2=5*5*2=50,cur=50,保持max=81

i=6,执行21行,cur=6^2=36,保持max=81

执行完毕,最终结果为81。

 

补充一个使用dp的解决方案:

1 public class Solution 2     { 3         public int IntegerBreak(int n) 4         { 5             int[] dp = new int[n + 1]; 6             dp[1] = 1; 7             for (int i = 2; i <= n; i++) 8             { 9                 for (int j = i-1; j >=1; j--)10                 {11                     var premax = dp[i - j];12                     var distance = i - j;13                     var cur = Math.Max(premax, distance) * j;14                     dp[i] = Math.Max(dp[i], cur);15                 }16             }17             return dp[n];18         }19     }

 

转载于:https://www.cnblogs.com/asenyang/p/6840312.html

你可能感兴趣的文章
实验六
查看>>
Sql Server中利用ISNULL方法判断数字并预设值
查看>>
可重入、不可重入
查看>>
html5之history对象 控制浏览器前进或后退事件
查看>>
将一个数据库中表的数据导入另一个数据库(DB2)
查看>>
8. String to Integer (atoi)
查看>>
PHP实现多进程并行执行脚本
查看>>
排列计数[SDOI2016]
查看>>
日期计算
查看>>
cf398A Snacktower
查看>>
bzoj2843极地旅行社
查看>>
【民间图灵奖】读《图灵的秘密》写读后感获图灵水杯
查看>>
IT兄弟连 JavaWeb教程 AJAX以及JSON字符串经典案例
查看>>
修改的超级比一比文档
查看>>
面向过程&面向对象 UML&RUP
查看>>
PHP接收二进制流并生成文件
查看>>
how does Array.prototype.slice.call() work?
查看>>
tensorflow_mmp
查看>>
Unity C# 设计模式(三)工厂方法模式
查看>>
201521123025 《Java程序设计》第1周学习总结
查看>>