給你一根長度為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動態規劃解決。
1class
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)
1long
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 表示...