首页 > 其他 > 详细

剑指offer 剪绳子

时间:2019-09-06 17:53:13      阅读:89      评论:0      收藏:0      [点我收藏+]

题目描述

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

 

剑指offer 剪绳子

原文:https://www.cnblogs.com/qinduanyinghua/p/11476881.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!