美文网首页
剑指offer----动态&贪婪

剑指offer----动态&贪婪

作者: 世界上的一道风 | 来源:发表于2019-08-09 11:06 被阅读0次
  1. 剪绳子:长度为n的绳子,剪成m段,各段长度记为k[0],...,k[m],求各段最大乘积多少?(n>1,m>1)
  • dp:即f(n)为把长度n的绳子剪成若干段([1,n-1])的最大乘积。
  • 用子问题定义原问题:f(n)= \max_{0<i<n}{f(i) * f(n-i)}
  • 由此可知应自底向上计算,保存小的结果。
#include <iostream>
#include<vector>
#include<algorithm>
#include<exception>
#include<set>
#include<map>
using namespace std;

int maxProductAfterCutting(int length)
{
  if(length<2)
        return 0;
    if(length == 2)
        return 1;
    if(length == 3)
     return 2;
    
    //products[i]代表f[i]
    int *products = new int[length+1] ;
    products[0] = 0; // dumps elems
    products[1] = 1;
    products[2] = 2;
    products[3] = 3;
    int max = 0;
    //遍历长度i
    for(int i=4; i<=length;++i)
    {
        max = 0;
        //切割大小为j,只计算前一半即可;
        for(int j=1; j<=i/2; ++j)
        {   
            //根据上述公式计算:取最大那个
            int product = products[j] * products[i-j];
            if(max < product) max = product;    
        }
        products[i] = max;  

    }
    max = products[length];
    delete[] products;
    return max;
}
int main() {
    cout << maxProductAfterCutting(9) << endl;
}

27
  • greedy:
int maxProductAfterCuttingGreedy(int length)
{
  if(length<2)
        return 0;
    if(length == 2)
        return 1;
    if(length == 3)
     return 2;
    
    //尽可能去剪长为3的绳子
    int timesOf3 = length / 3;
    // 当绳子为4例外,剪成2*2
    if (length - timesOf3*3==1)
            timesOf3-=1;
    int timesOf2 = (length - timesOf3 * 3) /2;
    return (int)(pow(3, timesOf3) * (int)(pow(2, timesOf2)));
}

相关文章

  • 剑指offer----动态&贪婪

    剪绳子:长度为的绳子,剪成段,各段长度记为,求各段最大乘积多少? dp:即为把长度的绳子剪成若干段()的最大乘积。...

  • 动态规划 && 贪婪算法

    动态规划 && 贪婪算法 1· 剪绳子(14 剑指offer ) 需要先从 base case 开始寻找规律 ,...

  • 剑指offer----树

    重建二叉树:根据前序和中序遍历的结果重建二叉树。假设输入的遍历结果都不含有重复的数字。 二叉树的下一个节点:给定一...

  • 剑指offer----递归

    斐波那契数列:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)...

  • 剑指offer----丑数

    题目:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子...

  • 剑指offer----矩形覆盖

    题目:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总...

  • 剑指offer----空格替换

    请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字...

  • 剑指offer----反转链表

    题目:输入一个链表,反转链表后,输出链表的所有元素。 方法一 递归 一般情况下反转的问题利用递归代码写起来是比较简...

  • 剑指offer----回溯法

    前言 回溯法适合多个步骤组成的问题,每个步骤有多个选项,形成一颗树状。 在叶节点的状态不满足条件,回溯到上一个节点...

  • 剑指offer----位运算

    1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放...

网友评论

      本文标题:剑指offer----动态&贪婪

      本文链接:https://www.haomeiwen.com/subject/coccjctx.html