leetcode343

 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                 else
24                 {
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                 else
34                 {
35                     break;
36                 }
37             }
38             return max;
39         }
40     }

 

https://leetcode.com/problems/integer-break/#/description

这道题的解题思路是,从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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值