剑指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 };

 

posted @ 2019-09-06 17:06  琴影  阅读(442)  评论(0编辑  收藏  举报