• 剑指offer 剪绳子


    题目描述

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

    输入描述:

    输入一个数n,意义见题面。(2 <= n <= 60)

    输出描述:

    输出答案。
    示例1

    输入

    8

    输出

    18

    思路:

    方法一:先列小的数找规律,发现最大乘积是2/3的组合

     1 int cutRope(int number) {
     2         if (number == 2)
     3             return 1;
     4         if (number == 3)
     5             return 2;
     6         int x = number % 3;
     7         int y = number / 3;
     8         if (x == 1) {
     9             return 4 * pow(3, y - 1);
    10         } else if (x == 2) {
    11             return 2 * pow(3, y);
    12         } else 
    13             return pow(3, y);
    14 } 

    方法二:动态规划

     1 class Solution {
     2 public:
     3     int cutRope(int number) {
     4         if (number == 2)
     5             return 1;
     6         if (number == 3)
     7             return 2;
     8         int *dp = new int[number + 1], maxN;
     9         dp[1] = 1;
    10         dp[2] = 2;
    11         dp[3] = 3;
    12         
    13         for (int i = 4; i <= number; i++) {
    14             int maxN = 0;
    15             for (int j = 1; j <= i / 2; j++) {
    16                 maxN = max(maxN, dp[j] * dp[i - j]);
    17             }
    18             dp[i] = maxN;
    19         }
    20         maxN = dp[number];
    21         delete[] dp;
    22         return maxN;
    23     }
    24 };
  • 相关阅读:
    dp uva1025
    dp uva10003
    dp最优矩阵相乘poj1651
    dp uva11584
    动态规划uva11400
    流形学习 (Manifold Learning)
    tf.nn.embedding_lookup
    word2vec
    word2vec 细节解析1
    collections-Counter
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/11476881.html
Copyright © 2020-2023  润新知