整数拆分 (dp,数学)

23 篇文章 0 订阅

下定决心,好好过一天 ~
题目传送
在这里插入图片描述

思路:在本子写写就知道。
2只能拆成 1 * 1,
3 为 1 * 2
可以看到,这俩个数拆了过后,他的乘积形式都比自身还小。那么就没必要
4 为 2 * 2
5 为 2 * 3
6 为 3 * 3
7 为 3 * 2 * 2
8 为 3 * 3 * 3
9 为 3 * 3 * 2 * 2
10 为 3 * 3 * 3 * 2

那么规律就出来了,第n个数的前一个数,如果有2的存在,那么直接把这个2变成3(n比n-1多1)
如果没有2,那么就得拆成俩个2出来,原因是,只有2和3拆了过后对其价值有所降低,而其他数拆了过后,其值都有增加。所有尽力拆成2和3的乘积形式。

那么我们保留第n-1个数的状态,保留状态为有多少个2. 然后根据上面递推第n个数的状态即可。

当然,大可不必用dp,只是我练手而已。

class Solution {
public:
    int integerBreak(int n) {
        int dp[1000] = {0};
        int sum[1000] = {0};
        dp[0] = 0;sum[0] = 0;
        dp[1] = 0;sum[1] = 0;
        dp[2] = 0;sum[2] = 1;
        dp[3] = 1;sum[3] = 2;
        dp[4] = 2;sum[4] = 4; //边界状态
        for(int i = 5;i <= n;i++)
        {
            if(dp[i-1] != 0)
            {
                dp[i] = dp[i-1]-1;
                int a = dp[i-1]-1;
                int b = (i - a*2)/3;
                sum[i] = (int)(pow(2,a))*(int)(pow(3,b));
            }
            else
            {
                dp[i] = 2;
                int a = 2;
                int b = (i - a*2)/3;
                sum[i] = (int)(pow(2,a))*(int)(pow(3,b));
            }
        }
        return sum[n];
    }
};
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值