日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

将长度为n的绳子分为m段求各段乘积的最大值

發(fā)布時(shí)間:2025/4/5 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 将长度为n的绳子分为m段求各段乘积的最大值 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 1 將長(zhǎng)度為n的繩子分為m段求各段乘積的最大值
      • 1.1 題目描述
      • 1.2 動(dòng)態(tài)規(guī)劃法解題
      • 1.3 貪心法求解

1 將長(zhǎng)度為n的繩子分為m段求各段乘積的最大值

1.1 題目描述

給你一根長(zhǎng)度為 n 的繩子,請(qǐng)把繩子剪成 m 段 (m 和 n 都是整數(shù),n>1 并且 m>1)每斷繩子的
長(zhǎng)度記為 k[0],k[1],…,k[m].請(qǐng)問(wèn) k[0] k[1]…*k[m]可能的最大乘積是多少?

1.2 動(dòng)態(tài)規(guī)劃法解題

動(dòng)態(tài)規(guī)劃法:
看題目就知道這玩意要用動(dòng)態(tài)規(guī)劃實(shí)現(xiàn),可是就是不知道狀態(tài)轉(zhuǎn)移方程如何推導(dǎo)出來(lái),費(fèi)了九牛二虎之力才把別人的講解看懂,這思維根本不在一個(gè)層面啊,看來(lái)還是太菜,路漫漫兮。

先來(lái)看下動(dòng)態(tài)規(guī)劃求解問(wèn)題的四個(gè)特征:
①求一個(gè)問(wèn)題的最優(yōu)解;
②整體的問(wèn)題的最優(yōu)解是依賴于各個(gè)子問(wèn)題的最優(yōu)解;
③小問(wèn)題之間還有相互重疊的更小的子問(wèn)題;
④從上往下分析問(wèn)題,從下往上求解問(wèn)題;

如下開(kāi)始對(duì)題目進(jìn)行分析:
有一段長(zhǎng)度為n的繩子,我們現(xiàn)在要剪第一刀,我可以選擇下第一刀的地方有1 ~ n-1這些地方;比如長(zhǎng)度為10的繩子,我第一刀可以在1~9這些地方下刀,共9種方式。

第一刀下去后,繩子分成兩部分,假設(shè)在i處下刀,繩子兩部分就分別為:[0 ~ i]與[i ~ n],長(zhǎng)度分為表示為i與n-i;那么找出第一刀最合適的位置,其實(shí)就是找i在哪下刀,可以使得[0 ~ i]與[i~n]的乘積最大,函數(shù)表示為:f(n)=max(f(i)×f(n?i))。

那么如何判斷i處切最大呢?這個(gè)時(shí)候,我們就要知道,[0~i]這個(gè)長(zhǎng)度的繩子,任意方式切,最大的乘積是多少;假如說(shuō),當(dāng)我們要切一個(gè)長(zhǎng)度為10的繩子:切成1和9與4和6,兩種方式,哪個(gè)乘積更大?

回答:不光要考慮第一刀后兩個(gè)繩子的大小,還要考慮到9、4、6這三種情況,因?yàn)榈谝坏肚谐龅睦K子長(zhǎng)度是否可以再切第二刀,使它有更大的乘積,比如將9再切成 3×3×3,6切成 4×2,哪個(gè)更大?

這種情況下,我們可以發(fā)現(xiàn),無(wú)論再怎么切,一定是越切越短,那么我們是否可以將小于給定長(zhǎng)度的繩子的每一個(gè)長(zhǎng)度的最大乘積都求出來(lái)?

即:長(zhǎng)度為10的繩子,我們就計(jì)算出:長(zhǎng)度1~9這9種長(zhǎng)度的繩子,每種長(zhǎng)度的最大乘積是多少。 要求長(zhǎng)度9的繩子的最大乘積,我們要知道1 ~ 8各個(gè)長(zhǎng)度的最大乘積,要知道長(zhǎng)度8的最大乘積,就要知道1 ~ 7長(zhǎng)度的各個(gè)最大乘積,以此類推。

代碼分析如下:
f(n)定義為將長(zhǎng)度為n的繩子分成若干段后的各段長(zhǎng)度的最大乘積(最優(yōu)解),在剪第一刀時(shí)有n-1種剪法,可選擇在0 < i < n處下刀。在i處下刀,分成長(zhǎng)度為i的左半繩子和長(zhǎng)度為n-i的右半繩子,對(duì)于這兩根繩子,定義最優(yōu)解為f(i)和f(n-i),于是f(n) = max(f(i) * f(n-i)),即求出各種相乘可能中的最大值就是f(n)的最優(yōu)解。就這樣從上到下的分下去,但是問(wèn)題的解決從下到上。即先求出f(2)、f(3)的最優(yōu)解,然后根據(jù)這兩個(gè)值求出f(4)、f(5)…直到f(n)。
f(2) = 1,因?yàn)橹荒芊殖蓛砂?#xff1b;f(3) = 2,因?yàn)榉殖蓛啥?1 大于分成三段的11*1。

public static int maxProductAfterCutting(int length){//長(zhǎng)度小于2 無(wú)法分割if(length<2)return 0;//長(zhǎng)度等于2 一分為二 1*1if(length==2)return 1;//長(zhǎng)度等于3 最大為1*2=2if(length==3)return 2;//定義一個(gè)存放>=4 長(zhǎng)度的數(shù)組 ,對(duì)>=4長(zhǎng)度的最大的乘積進(jìn)行臨時(shí)存儲(chǔ)int[] products=new int[length+1];//以下的前三個(gè)數(shù)組存放的不是最大值,而是長(zhǎng)度值products[1]=1;products[2]=2;products[3]=3;for(int i=4;i<=length;i++) {int maxModify=0;for(int j=1;j<=i/2;j++) {int product=products[j]*products[i-j];if(product>maxModify)maxModify=product;} //得到f(i)的最優(yōu)解products[i]=maxModify;} //返回發(fā)f(n)return products[length];}

也可使用遞歸的方式進(jìn)行求解:

int MaxProductCutting(int length) {if (length < 4){return length;}int max = 0;for (int i = 1; i <= length / 2; i++){int val = MaxProductCutting(i) * MaxProductCutting(length - i);if (val > max){max = val;}}return max; }int MaxProductAfterCutting1(int length) {if (length <= 1) return 0;if (length == 2) return 1;if (length == 3) return 2;return MaxProductCutting(length); }

1.3 貪心法求解

貪婪法,不斷分出長(zhǎng)度為3的繩子,如果最后只剩下長(zhǎng)度為1的繩子,退一步,將得到長(zhǎng)度為4的繩子,然后將這長(zhǎng)度為4的繩子分成22(這樣分是因?yàn)?2大于原來(lái)的31)。因此n = 4時(shí)不能分出長(zhǎng)度為3的繩子,而n = 2,n = 3可直接返回。當(dāng)n >=5時(shí)候,滿足n >=5這個(gè)不等式的有2(n-2) > n以及3*(n-3) > n 。注意到2+n-2 = 3+n-3 = n,也就是說(shuō)分出的兩個(gè)相乘的數(shù)要滿足和為n,且同樣的n,3*(n-3)的值更大,這就是為什么要不斷分出長(zhǎng)度為3的繩子的原因。

代碼如下:

public static int maxProductAfterCutting2(int length) {// 長(zhǎng)度為1時(shí)不滿足題意,返回0if (length < 2) {return 0;}// f(2)if (length == 2) {return 1;}// f(3)if (length == 3) {return 2;} // 統(tǒng)計(jì)能分出多少段長(zhǎng)度為3的繩子int timesOf3 = length / 3;// 如果最有只剩下長(zhǎng)度為1的繩子,需要退一步,得到長(zhǎng)度為4的繩子,重新分成2*2的if (length - timesOf3 * 3 == 1) {timesOf3--;}// 到這步length - timesOf3 * 3的值只可能是0,2,4,所以timesOf2只可能是0, 1, 2int timesOf2 = (length - timesOf3 * 3) / 2;return (int) Math.pow(3, timesOf3) * (int) Math.pow(2, timesOf2); }

參考資料:

  • https://blog.csdn.net/u012429555/article/details/83184146
  • 總結(jié)

    以上是生活随笔為你收集整理的将长度为n的绳子分为m段求各段乘积的最大值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 一本综合久久 | 亚洲蜜桃av | 青青伊人影院 | 午夜欧美精品 | 日韩淫视频| 一区二区三区伦理 | 久久精品天天中文字幕人妻 | 中文在线字幕免费观看电 | 高清久久久久久 | 国产精品三级在线观看 | 国产乱色精品成人免费视频 | 麻豆www.| 欧美精品一区三区 | 欧美日韩精品一区二区三区视频播放 | 亚洲天堂av一区 | 神马午夜一区二区 | 国产精品伦理一区二区 | 97人妻人人澡人人爽人人精品 | 免费高清av | 日本成人激情视频 | 亚洲三级在线 | 日韩毛片无码永久免费看 | 亚洲精品www.| 我要看一级黄色片 | 黄色在线观看网站 | 在线看的av网站 | 黄黄的视频在线观看 | 午夜免费在线 | 五月天最新网址 | av在线天天 | 欧美一区二区成人 | 在线免费观看一区二区三区 | 欧美亚洲综合网 | 免费中文视频 | 国产大学生自拍视频 | 欧美午夜视频在线观看 | 免费av网站大全 | 操亚洲美女 | 一级α片免费看刺激高潮视频 | 欧美在线观看视频一区二区 | 成人涩涩软件 | 国产98在线 | 天天干天天玩 | 欧美韩日国产 | 国产精品无码久久久久一区二区 | 免费成人小视频 | 国产素人在线观看 | 成年人看片网站 | 中文字幕在线免费看 | 天天综合影院 | 美女黄免费 | 亚洲成人网页 | 91在线观看视频网站 | 久热中文字幕 | 精品国产一区二区三区久久久蜜月 | 91久久久久国产一区二区 | 精品久久久久久久久久久久久久久久久 | 狼人伊人久久 | 国精产品一区一区三区有限公司杨 | 日本少妇久久 | 91av国产在线 | 久久女人天堂 | 妺妺窝人体色www聚色窝仙踪 | 精品产国自在拍 | 视频黄页在线观看 | 成人片在线播放 | 色噜噜噜| 国产综合精品一区二区三区 | 黄色录像大片 | 久久久久久久亚洲 | 国产乱真实合集 | 久久艹中文字幕 | 毛片在线视频观看 | 狠狠搞av| 欧美成人一级视频 | 国产在线小视频 | 女女爱爱视频 | 欧美日韩在线播放三区四区 | 欧美激情videos | 天天干狠狠爱 | 色综合av综合无码综合网站 | 一二三av | 无码人妻丰满熟妇啪啪 | 男女羞羞动态图 | 性做久久久久久免费观看欧美 | 天堂av网站| 三年中国片在线高清观看 | 美女黄18以下禁止观看 | 天天拍天天色 | 免费在线视频观看 | 在线综合网 | 九九热精品在线视频 | 99久久免费国产精精品 | www.夜夜骑 | 在线一级片| 香港一级纯黄大片 | 色网站在线观看 | 日韩亚洲精品视频 | 国产欧美在线观看视频 |