题解
思路
代码
class Solution:
### 1124 动态规划(1104 ms,13.4 MB)
def cuttingRope(self, n: int) -> int:
dp = [0] * (n+1)
dp[2] = 1
for i in range(3, n+1):
for j in range(1, i):
dp[i] = max(dp[i], max((i-j)*j, dp[i-j]*j))
return dp[n] % 1000000007
### 1124 数学求极值(36 ms,13.4 MB)
def cuttingRope(self, n: int) -> int:
if n <= 3: return n - 1
a, b = n // 3, n % 3
if b == 0: return 3 ** a % 1000000007
if b == 1: return 3 ** (a - 1) * 4 % 1000000007
return 3 ** a * 2 % 1000000007
### 1124 数学求极值 + 大数求余(36 ms,13.5 MB)
def cuttingRope(self, n: int) -> int:
if n <= 3: return n - 1
x = 3
a = n // 3 - 1 # 注意:这里的a为n // 3 - 1,因此最后返回时需要多乘以一个3,得到正确的x^a
b = n % 3
rem = 1 # 用于迭代a-1次,最终得到x^(a-1)
p = 1000000007
# 1.快速幂求余
while a > 0:
if a % 2: rem = (rem * x) % p
x = x ** 2 % p
a //= 2
# 2.循环求余
for _ in range(a):
rem = (rem * x) % p
if b == 0: return (rem * 3) % p # = 3^(a+1) % p
if b == 1: return (rem * 4) % p # = 3^a * 4 % p
return (rem * 6) % p # = 3^(a+1) * 2 % p