LeetCode 343. Integer Break

问题重述:
n可以拆分成多个(两个及以上)数的和,求这几个数最大的乘积;例如8=4+4,8=3+3+2,最大的乘积是3*3*2=18

代码如下:

public class Solution {
    public int integerBreak(int n) {
        int[] result = new int[n - 1];
        if(n == 2) return 1;
        else if(n == 3) return 2;
        else if(n == 4) return 4;
        result[0] = 2; //2
        result[1] = 3; //3
        result[2] = 4; //4
        for(int i = 3; i < n - 1; i++){
            result[i] = result[i - 3] * 3; 
        }
        return result[n - 2];
    }
}

思路:
设函数f(n)为所求结果,要求输入的n>4,f(n)定义如下:
f(n)=Math.max(2*f(n-2),3*f(n-3));
f(2)=2;(这个是为了计算更大的数而设定的值)
f(3)=3;(这个是为了计算更大的数而设定的值)
f(4)=4;
其中当n>4时,3*f(n-3)>=2*f(n-2),证明如下:
(1)n=5是3*f(n-3)=6=2*f(n-2)
(2)设n属于[5,x]时,3*f(n-3)>=2*f(n-2),也即n属于[5,x]时f(n)=3*f(n-3)
(3)当n=x+1时,需证3*f(n-2)>=2*f(n-1)
从2中可知,n属于[5,x]时f(n)=3*f(n-3)
不等式双方循环提取3并约分,将原不等式转化为:
3*f(a)>=2*f(a+1),其中a属于[2,4]
a=2时,左侧=6=右侧;
a=3时,左侧=9>右侧=8;
a=4时,左侧=12=右侧,(3)得证。
原命题的证。
所以f(n)=3*f(n-3);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值