26
26
27
27
## 解法
28
28
29
- 尽可能将绳子以长度 3 等分剪为多段时,乘积最大。
29
+ ** 方法一:动态规划**
30
+
31
+ 我们定义 $dp[ i] $ 表示正整数 $n$ 能获得的最大乘积,初始化 $dp[ 1] = 1$。答案即为 $dp[ n] $。
32
+
33
+ 状态转移方程为:
34
+
35
+ $$
36
+ dp[i] = max(dp[i], dp[i - j] \times j, (i - j) \times j) \quad (j \in [0, i))
37
+ $$
38
+
39
+ 时间复杂度 $O(n^2)$,空间复杂度 $O(n)$。其中 $n$ 为正整数 $n$。
40
+
41
+ ** 方法二:数学**
42
+
43
+ 当 $n \lt 4$ 时,$n$ 不能拆分成至少两个正整数的和,因此 $n - 1$ 是最大乘积。当 $n \ge 4$ 时,我们尽可能多地拆分 $3$,当剩下的最后一段为 $4$ 时,我们将其拆分为 $2 + 2$,这样乘积最大。
44
+
45
+ 时间复杂度 $O(1)$,空间复杂度 $O(1)$。
30
46
31
47
<!-- tabs:start -->
32
48
33
49
### ** Python3**
34
50
51
+ ``` python
52
+ class Solution :
53
+ def cuttingRope (self , n : int ) -> int :
54
+ dp = [1 ] * (n + 1 )
55
+ for i in range (2 , n + 1 ):
56
+ for j in range (1 , i):
57
+ dp[i] = max (dp[i], dp[i - j] * j, (i - j) * j)
58
+ return dp[n]
59
+ ```
60
+
35
61
``` python
36
62
class Solution :
37
63
def cuttingRope (self , n : int ) -> int :
38
64
if n < 4 :
39
65
return n - 1
40
- ans = 1
41
- while n > 4 :
42
- ans *= 3
43
- n -= 3
44
- ans *= n
45
- return ans
66
+ if n % 3 == 0 :
67
+ return pow (3 , n // 3 )
68
+ if n % 3 == 1 :
69
+ return pow (3 , n // 3 - 1 ) * 4
70
+ return pow (3 , n // 3 ) * 2
46
71
```
47
72
48
73
### ** Java**
49
74
50
75
``` java
51
76
class Solution {
52
77
public int cuttingRope (int n ) {
53
- if (n < 4 ) {
54
- return n - 1 ;
55
- }
56
- int ans = 1 ;
57
- while (n > 4 ) {
58
- ans *= 3 ;
59
- n -= 3 ;
78
+ int [] dp = new int [n + 1 ];
79
+ dp[1 ] = 1 ;
80
+ for (int i = 2 ; i <= n; ++ i) {
81
+ for (int j = 1 ; j < i; ++ j) {
82
+ dp[i] = Math . max(Math . max(dp[i], dp[i - j] * j), (i - j) * j);
83
+ }
60
84
}
61
- ans *= n;
62
- return ans;
85
+ return dp[n];
63
86
}
64
87
}
65
88
```
66
89
67
- ### ** JavaScript **
68
-
69
- ``` js
70
- /**
71
- * @param {number} n
72
- * @return {number }
73
- */
74
- var cuttingRope = function ( n ) {
75
- if (n < 4 ) return n - 1 ;
76
- let ans = 1 ;
77
- while (n > 4 ) {
78
- ans *= 3 ;
79
- n -= 3 ;
90
+ ``` java
91
+ class Solution {
92
+ public int cuttingRope ( int n ) {
93
+ if (n < 4 ) {
94
+ return n - 1 ;
95
+ }
96
+ if (n % 3 == 0 ) {
97
+ return ( int ) Math . pow( 3 , n / 3 );
98
+ }
99
+ if (n % 3 == 1 ) {
100
+ return ( int ) Math . pow( 3 , n / 3 - 1 ) * 4 ;
101
+ }
102
+ return ( int ) Math . pow( 3 , n / 3 ) * 2 ;
80
103
}
81
- ans *= n;
82
- return ans;
83
- };
84
- ```
85
-
86
- ### ** Go**
87
-
88
- ``` go
89
- func cuttingRope (n int ) int {
90
- if n < 4 {
91
- return n - 1
92
- }
93
- ans := 1
94
- for n > 4 {
95
- ans *= 3
96
- n -= 3
97
- }
98
- ans *= n
99
- return ans
100
104
}
101
105
```
102
106
@@ -107,10 +111,10 @@ class Solution {
107
111
public:
108
112
int cuttingRope(int n) {
109
113
vector<int > dp(n + 1);
110
- dp[ 0 ] = 1;
111
- for (int i = 1 ; i < n; ++i) {
112
- for (int j = i ; j <= n ; ++j) {
113
- dp[ j ] = max(dp[ j ] , dp[ j - i ] * i );
114
+ dp[ 1 ] = 1;
115
+ for (int i = 2 ; i <= n; ++i) {
116
+ for (int j = 1 ; j < i ; ++j) {
117
+ dp[ i ] = max(max( dp[ i ] , dp[ i - j ] * j), (i - j) * j );
114
118
}
115
119
}
116
120
return dp[ n] ;
@@ -122,33 +126,107 @@ public:
122
126
class Solution {
123
127
public:
124
128
int cuttingRope(int n) {
125
- if (n < 4) return n - 1;
126
- int ans = 1;
127
- while (n > 4)
128
- {
129
- ans *= 3;
130
- n -= 3;
129
+ if (n < 4) {
130
+ return n - 1;
131
131
}
132
- ans *= n;
133
- return ans;
132
+ if (n % 3 == 0) {
133
+ return pow(3, n / 3);
134
+ }
135
+ if (n % 3 == 1) {
136
+ return pow(3, n / 3 - 1) * 4;
137
+ }
138
+ return pow(3, n / 3) * 2;
139
+ }
140
+ };
141
+ ```
142
+
143
+ ### ** Go**
144
+
145
+ ``` go
146
+ func cuttingRope (n int ) int {
147
+ dp := make ([]int , n+1 )
148
+ dp[1 ] = 1
149
+ for i := 2 ; i <= n; i++ {
150
+ for j := 1 ; j < i; j++ {
151
+ dp[i] = max (max (dp[i], dp[i-j]*j), (i-j)*j)
152
+ }
153
+ }
154
+ return dp[n]
155
+ }
156
+
157
+ func max (a , b int ) int {
158
+ if a > b {
159
+ return a
160
+ }
161
+ return b
162
+ }
163
+ ```
164
+
165
+ ``` go
166
+ func cuttingRope (n int ) int {
167
+ if n < 4 {
168
+ return n - 1
169
+ }
170
+ if n%3 == 0 {
171
+ return int (math.Pow (3 , float64 (n/3 )))
172
+ }
173
+ if n%3 == 1 {
174
+ return int (math.Pow (3 , float64 (n/3 -1 ))) * 4
175
+ }
176
+ return int (math.Pow (3 , float64 (n/3 ))) * 2
177
+ }
178
+ ```
179
+
180
+ ### ** JavaScript**
181
+
182
+ ``` js
183
+ /**
184
+ * @param {number} n
185
+ * @return {number}
186
+ */
187
+ var cuttingRope = function (n ) {
188
+ if (n < 4 ) {
189
+ return n - 1 ;
134
190
}
191
+ const m = Math .floor (n / 3 );
192
+ if (n % 3 == 0 ) {
193
+ return 3 ** m;
194
+ }
195
+ if (n % 3 == 1 ) {
196
+ return 3 ** (m - 1 ) * 4 ;
197
+ }
198
+ return 3 ** m * 2 ;
135
199
};
136
200
```
137
201
202
+ ### ** TypeScript**
203
+
204
+ ``` ts
205
+ function cuttingRope(n : number ): number {
206
+ if (n < 4 ) {
207
+ return n - 1 ;
208
+ }
209
+ const m = Math .floor (n / 3 );
210
+ if (n % 3 == 0 ) {
211
+ return 3 ** m ;
212
+ }
213
+ if (n % 3 == 1 ) {
214
+ return 3 ** (m - 1 ) * 4 ;
215
+ }
216
+ return 3 ** m * 2 ;
217
+ }
218
+ ```
219
+
138
220
### ** Rust**
139
221
140
222
``` rust
141
223
impl Solution {
142
- pub fn cutting_rope (mut n : i32 ) -> i32 {
224
+ pub fn cutting_rope (n : i32 ) -> i32 {
143
225
if n < 4 {
144
226
return n - 1 ;
145
227
}
146
- let mut res = 1 ;
147
- while n > 4 {
148
- res *= 3 ;
149
- n -= 3 ;
150
- }
151
- res * n
228
+ let count = (n - 2 ) / 3 ;
229
+ 3i32 . pow (count as u32 ) * (n - count * 3 )
152
230
}
153
231
}
154
232
```
@@ -161,13 +239,13 @@ public class Solution {
161
239
if (n < 4 ) {
162
240
return n - 1 ;
163
241
}
164
- int ans = 1 ;
165
- while (n > 4 ) {
166
- ans *= 3 ;
167
- n -= 3 ;
242
+ if (n % 3 == 0 ) {
243
+ return (int ) Math .Pow (3 , n / 3 );
244
+ }
245
+ if (n % 3 == 1 ) {
246
+ return (int ) Math .Pow (3 , n / 3 - 1 ) * 4 ;
168
247
}
169
- ans *= n ;
170
- return ans ;
248
+ return (int ) Math .Pow (3 , n / 3 ) * 2 ;
171
249
}
172
250
}
173
251
```
0 commit comments