劍指offer 面試題 剪繩子

2022-05-08 22:12:11 字數 1578 閱讀 6783

給你一根長度為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,可以切為1和n-1,2和n-2.......等等。即遞推方程為for(i=1~n-1),dp[n]=max(dp[n-i]*dp[i],dp[n])

但此題有個要求是m>1,即不能不切,這對小於4的數有影響。2只能切一刀,1*1=1。3切一刀1*2=2。4最大2*2=4,5最大2*3=6,即之後的n分割的乘積就大於等於n自己了。

所以對於小於4的n單獨返回,其他n動態規劃解決。

1

class

solution

5if(number==3)

6 vector dp(number+1

,int_min);

7 dp[1]=1,dp[2]=2,dp[3]=3,dp[4]=4;8

for(int i=5;i<=number;++i)

12 cout<"

"14return

dp[number];15}

16 };

如:4 : 2*2

5 : 2*3

6 : 3*3

7 : 2*2*3 或者4*3

8 : 2*3*3

9 : 3*3*3

10:2*2*3*3 或者4*3*3

11:2*3*3*3

12:3*3*3*3

13:2*2*3*3*3 或者4*3*3*3

另外不可能有超過兩個2出現在結果中。因為3個2的和為6,6可以分解為兩個3,3*3=9,2*2*2=8,9>8,所以不可能分割為3個2。

所以首先我們盡量找更多的3,即n/3個3。如果n%3==1,那麼只能少拿乙個3,和餘的1一起分割成兩個2。如7%3==1,那麼最大=3*2*2

如果n%3==2,那麼直接2*pow(2,n/3)。如8%3==2,最大=2*pow(3,8/3)

1

long

long n_max_3(long

long

n) 5

if (n == 3) 8

long

long x = n % 3;9

long

long y = n / 3;10

if (x == 0

) else

if (x == 1

) else

17 }

劍指offer 面試題14 剪繩子

給你一段長度為n的繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。第一種是動態規劃 自下而上 public...

《劍指Offer》面試題14 剪繩子

要求 剪繩子 給你一根長度為n的繩子,請把繩子剪成m段 m n都是整數,n 1,並且m 1 每段繩子的長度記為k 0 k 1 k m 請問看k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2,3,3,的三段,此時得到的最大乘積是18。測試用例 功能測試 ...

面試題14 劍指offer 剪繩子

題目 給你一根長度為n的繩子,請把繩子剪成m段 m和n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度為8時,我們把它剪成長度分別為2,3,3的三段,此時得到的最大乘積是18.思路 利用動態規劃法,f n 表示...