• 面试题14


    题目地址:https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof/

    题目描述

    给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m] 。请问 k[0]*k[1]*...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

    答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

    题目示例

    示例 1:

    输入: 2
    输出: 1
    解释: 2 = 1 + 1, 1 × 1 = 1
    示例 2:

    输入: 10
    输出: 36
    解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

    解题思路

    分析题目可知,此题与 面试题14- I. 剪绳子 几乎一样,唯一不同的是此题涉及大数越界。列出长度为1~6的情况,可以发现当绳子长度L小于4时,将绳子划分为1和L-1时获得的乘积最大;当绳子程度L=4时,将绳子划分为2和2获得的乘积最大;当绳子长度大于5时,我们优先考虑划分成长度为3的段,若没有,则考虑划分为2的段,最后考虑划分为1的段,也就是说,尽可能的划分多段的3,或者若干个3和两个2,所以,划分的最大乘积*3,然后取余就是结果了。

    程序源码

    class Solution {
    public:
        int cuttingRope(int n) {
            if(n == 0) return 0;
            vector<long> dp(1001, 0);
            dp[1] = 1; //绳长为1时,最大乘积dp[1]=1
            dp[2] = 1; //绳长为2时,划分为1和1,即(2=1+1),最大乘积dp[2]=1*1=1
            dp[3] = 2; //绳长为3时,划分为1和2,即(3=1+2),最大乘积dp[3]=1*2=2
            dp[4] = 4; //绳长为4时,划分为1和3,即(4=1+3),最大乘积dp[4]=1*3=3
            dp[5] = 6; //绳长为5时,划分为2和3,即(5=2+3),最大乘积dp[5]=2*3=6
            dp[6] = 9; //绳长为6时,划分为3和3,即(6=3+3),最大乘积dp[6]=3*3=9
            for(int i = 7; i <= n; i++)
            {
                dp[i] = (3*dp[i - 3]) % 1000000007;
            }
            return dp[n];
        }
    };
    ----------------------------------- 心之所向,素履所往;生如逆旅,一苇以航。 ------------------------------------------
  • 相关阅读:
    设计模式
    雨夹雪背景特效
    lottie-前端实现AE动效
    响应式布局实现原理
    关于小程序(含uniapp)中使用npm模块
    使用脚手架快速搭建React项目
    vue项目接入友盟统计站点数据
    git常用命令
    uniapp请求方法的封装
    小程序获取用户登录及手机号登录
  • 原文地址:https://www.cnblogs.com/wzw0625/p/12821717.html
Copyright © 2020-2023  润新知