• 新增1 剪绳子


    给你一根长度为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.

    解题思路:
    本题有动态规划算法的几个明显特征:
    (1)是求最优解问题,如最大值,最小值;
    (2)该问题能够分解成若干个子问题,并且子问题之间有重叠的更小子问题。
    通常按照如下4个步骤来设计一个动态规划算法:
    (1)刻画一个最优解的结构特征;
    (2)递归地定义最优解的值;
    (3)计算最优解的值,通常采用自底向上的方法;
    (4)利用计算出的信息构造一个最优解。
    以此题为例,我们定义长度为n的绳子剪切后的最大乘积为f(n),剪了一刀后,f(n)=max(f(i)*f(n-i));假设n为10,第一刀之后分为了4-6,而6也可能再分成2-4(6的最大是3-3,但过程中还是要比较2-4这种情况的),而上一步4-6中也需要求长度为4的问题的最大值,可见,各个子问题之间是有重叠的,所以可以先计算小问题,存储下每个小问题的结果,逐步往上,求得大问题的最优解。

    int maxCutting(int length){
            if(length<2) 
                  return 0;
            if(length==2)
                return 1;
            if(length==3)
                return 2;
            vector<int> dp(length + 1,0);
            dp[0]=0;
            dp[1]=1;
            dp[2]=2;
            dp[3]=3;
            int Max= 0;
            int temp = 0;
            for(int i=4;i<=length;i++){
                Max = 0;
                for(int j=1;j<=i/2;j++){
                    temp = dp[j]*dp[i-j];
              Max = max(temp,Max);
    } dp[i] = Max; } return dp[length]; }
  • 相关阅读:
    Opencv-Python 学习
    Python图片处理
    sae flask 微信公众平台开发
    Python 定位字符串
    Python检测IP合法 是否为公网IP
    Python requests 为pfsense 添加Routes
    lua-nginx-module 学习
    CDN 学习笔记
    教程
    2020-2021-1 20209327 《Linux内核原理与分析》第十二周作业
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8612371.html
Copyright © 2020-2023  润新知