剑指offerpython_剑指offer-14剪绳子-python

《剑指offer》python实现系列,全目录

动态规划

$$f(n) = max(f(i)*f(n-i))$$

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20#使用动态规划模版 https://sbaban.com/dp20.html

class Solution(object):

def cuttingRope(self, n):

"""

:type n: int

:rtype: int

"""

if n == 2:

return 1

if n == 3:

return 2

dp = [1]*(n+1)#建立dp数组

dp[1] = 1#初始化base

dp[2] = 2 #2只能分成1和1,但实际上不分解更大

dp[3] = 3 #3分成2和1最大,但实际上不分解最大,

#进行状态转移

for i in range(4,n+1):#对每个状态4~n

for j in range(1,i//2+1):#对每种选择

dp[i] = max(dp[i],dp[i-j]*dp[j])#状态转移方程

return dp[-1]

找规律

1 | 2 | 3 | 4 | 5 | 6 | 7 | 8

1 | 1,1 | 1,2 | 2,2 | 2,3 | 3,3 | 3,4 | 2,3,3

1 | 令f(2)=2 | 令f(3)=3 | 1·f(3) | 2·f(3) | 3·f(3) | 3·f(4) | 2·f(6)

由于2,3都比分后的乘积大,所以比3大的数字来说可以不拆分2和3,所以我们令f(2)=2,f(3)=3.

$f(4) = max(1f(3), 2f(2) , 3f(1))$

$f(5) = max(1f(4), 2f(3) , 3f(2)) , 4f(1)$

$f(6) = max(1f(5), 2f(4) , 3f(3) , 4f(2) , 5f(1))$

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17class Solution:

def cutRope(self, number):

if number == 1 or number == 2:

return 1

elif number == 3:

return 2

scorelist = [1]*(number+1)

scorelist[2], scorelist[3] = 2,3 #对2和3特殊处理

maxscore = 1

for i in range(4,number+1):

for j in range(1,i):

temp = j * scorelist[i-j]

if temp > maxscore:

maxscore = temp

scorelist[i] = maxscore

return scorelist[number]

改进:

f(n) = max(f(i)·f(n-i)), 其中,0

缩小for循环

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17class Solution:

def cutRope(self, number):

if number == 1 or number == 2:

return 1

elif number == 3:

return 2

scorelist = [1]*(number+1)

scorelist[2], scorelist[3] = 2,3 #对2和3特殊处理

maxscore = 1

for i in range(4,number+1):

for j in range(1,i//2+1):#改进

temp = scorelist[j] * scorelist[i-j]# 改进

if temp > maxscore:

maxscore = temp

scorelist[i] = maxscore

return scorelist[number]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值