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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

高效算法之动态规划(第15章)

發布時間:2025/3/15 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 高效算法之动态规划(第15章) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有人說:越炫耀什么,越缺少什么。但我卻以為:越缺少什么,越覺得別人炫耀什么。 ——李宮俊《李宮俊的詩》

0. 前言

參考圖書《算法導論》
  動態規劃通常用來解決最優化問題,在這類問題中,我們通常做出一組選擇來表達最優解。在做出這個選擇的同時,通常會生成與原問題形式相同的子問題。當多于一個選擇子集都生成相同的子問題時,動態規劃技術通常很有效,其關鍵技術就是對每一個這樣的子問題都保存其解,當其重復出現的時候即可避免重復求解。這種思想可以將指數時間的算法轉換為多項式時間的算法。
  動態規劃(dynamic programming)是運籌學的一個分支,是求解決策過程(decision process)最優化的數學方法。動態規劃(dynamic programming)中的programming指的是一種表格法,不是編寫計算機程序。
  

1. 動態規劃解析

采用動態規劃求解的問題的一般要具有3個性質:

(1) 最優化原理:如果問題的最優解所包含的子問題的解也是最優的,就稱該問題具有最優子結構,即滿足最優化原理。 (2) 無后效性:即某階段狀態一旦確定,就不受這個狀態以后決策的影響。也就是說,某狀態以后的過程不會影響以前的狀態,只與當前狀態有關。 (3)有重疊子問題:即子問題之間是不獨立的,一個子問題在下一階段決策中可能被多次使用到。(該性質并不是動態規劃適用的必要條件,但是如果沒有這條性質,動態規劃算法同其他算法相比就不具備優勢)。

動態規劃求解基本步驟:

1. 刻畫一個最優解的結構特征。2. 遞歸的定義最優解的值。3. 計算最優解的值,通常采用自底向上的方法。4. 利用計算出的信息構造一個最優解。

2. 動態規劃的應用

2.1 鋼條切割

問題陳述:給定一個長度為n英寸的鋼條和一個價格表pii=1,2,3,4....,n,求切割鋼條的方案,使得銷售收入最大。

長度i12345678910
價格pi1589101717202430

問題分析:從題目中我們可以得出給定的長度為n的鋼條有2n?1種不同的切割方案,因為在距離鋼條左端i(i=1,2,3..,n?1)英寸處,我們總是可以選擇切割或者不切割。對于上述的價格表樣例,我們可以觀察所有最優收益值ri(i=1,2,3,4...10) 以及對應的最優切割方案:

r1=1, 切割方案1=1(無切割)
r2=5, 切割方案2=2(無切割)
r3=8, 切割方案3=3(無切割)
r4=10, 切割方案4=2+2
r5=13, 切割方案5=2+3
r6=17, 切割方案6=6(無切割)
r7=18, 切割方案7=6+1或者7=2+2+3
r8=22, 切割方案8=2+6
r9=25, 切割方案9=3+6
r10=30, 切割方案10=10(無切割)
  更一般的對于rn(n>=1), 我們可以用更短的鋼條的最優切割收益來描述它:

rn=max(pn,r1+rn?1,r2+rn?2,r3+rn?3....rn?2+r2,rn?1+r1)
注意,為了求解規模為n的原問題,我們求解形式完全一樣(最優解結構特征刻畫),完成首次切割之后我們將兩段鋼條看作兩個獨立的鋼條切割問題,通過組合兩個相關子問題的最優解(最優子結構),并且在所有可能的兩段切割方案中選取組合收益最大者,構成原問題的最優解。
除了上述求解方式還有一種遞歸求解的方式公式如下:
rn=max(pi+rn?1)(1in)

算法設計:
自頂向下的普通遞歸算法設計:

SteelCut(p[],n){//初次判斷if(n==0){return 0;}int q=-1;//不做切割if(n<=p.length){q=p[n];}//遞歸求解for(i=1 to n){q=max(q,p[i]+SteelCut(p[],n-i));}return q; }

使用動態規劃的算法設計:

//算法1:帶備忘錄的自頂向下法 MemorizedSteelCut(p[],n){int r[] = new int[n];for(i=0 to n){r[i]=-1;}return MemorizedSteelCutAux(p[],n,r); } MemorizedSteelCutAux(p[],n,r){if(r[n]>=0){return r[n];}if(n==0){q=0;}else{q=-1;for(i=1 to n){q=max(q,p[i]+MemorizedSteelCutAux(p[],n-i,r)); }}r[n]=q;return q; }//算法2:自底向上法 BottomUpSteelCut(p[],n){int r[] = new int[n];r[0]=0;for(j=1 to n){q=-1;for(i=1 to j){q=max(q,p[i]+r[j-i]);}r[j]=q;} }

Java實現:

package lbz.ch15.dp.ins1; /** * @author LbZhang* @version 創建時間:2016年3月4日 下午2:20:33 * @description 鋼條切割問題*/ public class SteelCutting {public static void main(String[] args) {System.out.println("DP 在鋼條切割問題中的應用 ");int price[] = {1,5,8,9,10,17,17,20,24,30};int n = 10;//自頂向下的遞歸實現int result = 0;result = TopToBottomRecursion(price,n);System.out.println("常規的思路:"+result);//使用動態規劃來實現 備忘錄result=MemorizedSteelCut(price,n);System.out.println("備忘錄法:"+result);//使用動態規劃的自底向上非遞歸的實現result=BottomToTopSteelCut(price,n);System.out.println("自底向上非遞歸方法:"+result);}private static int BottomToTopSteelCut(int[] price, int n) {int r[] = new int[n+1];r[0]=0;//動態表的開頭for(int j=1;j<=n;j++){int q=-1;for(int i=1;i<=j;i++){q=maxOfTwo(q,price[i-1]+r[j-i]);}r[j]=q;}return r[n];}/*** 備忘錄方法* @param price* @param n* @return*/private static int MemorizedSteelCut(int[] price, int n) {int r[] = new int[n+1];for(int i=0;i<=n;i++){r[i]=-1;}return MemorizedSteelCutAux(price,n,r);}/*** 輔助過程的備忘錄核心算法* @param price* @param n* @param r* @return*/private static int MemorizedSteelCutAux(int[] price, int n, int[] r) {if(r[n]>=0){return r[n];}int q=0;if(n==0){q=0;}else{q=-1;for(int i=1;i<=n;i++){//price[i-1] 應為price的下標是從0開始,q=maxOfTwo(q,price[i-1]+MemorizedSteelCutAux(price,n-i,r)); }}r[n]=q;return q;}/*** //自頂向下的遞歸實現 常規思路* @param price ``````````````````````````````````````````````````````````````````* @param n* @return*/private static int TopToBottomRecursion(int[] price, int n) {if(n==0) return 0;int q = -1;if(n<=price.length){q=price[n-1];}for(int i=1;i<n;i++){q=maxOfTwo(q,price[i-1]+TopToBottomRecursion(price,n-i));}return q;}private static int maxOfTwo(int x, int y) {return x>y?x:y;//三目運算符的使用}}

重構解-對源程序進行修改

private static int BottomToTopSteelCut(int[] price, int n) {int r[] = new int[n+1];int s[] = new int[n+1];r[0]=0;//動態表的開頭for(int j=1;j<=n;j++){int q=-1;for(int i=1;i<=j;i++){//q=maxOfTwo(q,price[i-1]+r[j-i]);if(q<price[i-1]+r[j-i]){q=price[i-1]+r[j-i];s[j]=i;}}r[j]=q;}System.out.println();for(int temp=0;temp<=n;temp++){System.out.print(s[temp]+"|-"+temp+"-|");}System.out.println();//正確的組合輸出printToFormal(s);return r[n];}private static void printToFormal(int[] s) {int len=s.length-1;int temp=s[len];System.out.print("鋼條切割的組合方式: "+temp+" ");while(temp!=len){len=len-temp;temp=s[len];System.out.print("+ "+temp+" ");}System.out.println();}

2.2 斐波那契數列

下面直接給出斐波那契數列的Java實現的O(n)的動態規劃算法實現。

package lbz.ch15.dp.ins1;/*** @author LbZhang* @version 創建時間:2016年3月7日 下午9:42:15* @description 類說明*/ public class MemoryAndTable {static int MAX = 20;static int[] lookUp = new int[MAX];public static int fibMemory(int n) {if (lookUp[n] == 0) {if (n <= 1) {lookUp[n] = n;} else {lookUp[n] = fibMemory(n - 1) + fibMemory(n - 2);}}return lookUp[n];}// //打表(自下而上)public static int fibTable(int n) {int[] f = new int[n + 1];int i;f[0] = 0;f[1] = 1;for (i = 2; i <= n; i++) {f[i] = f[i - 1] + f[i - 2];}return f[n];}public static void main(String[] args) {int n = 5;System.out.println(fibMemory(9));System.out.println();// int res=0;// res=fibTable(9);System.out.println(fibTable(9));} }

注意:在動態規劃中,子問題解決方案被存儲在一個表中,以便這些不必重新計算。 因此,如果這個問題是沒有共同的(重疊)子問題, 動態規劃是沒有用的。例如,二分查找不具有共同的子問題。

轉載于:https://www.cnblogs.com/mrzhang123/p/5365807.html

總結

以上是生活随笔為你收集整理的高效算法之动态规划(第15章)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲第一av网 | 操碰97| 国产美女操 | 欧美美女网站 | 粉嫩一区 | 国产精品伦理一区二区 | 91成人一区二区三区 | 中文字幕三区 | 精品自拍第一页 | 亚洲色图35p | 亚洲精品成人无码毛片 | av鲁丝一区鲁丝二区鲁丝三区 | 欧美日韩激情在线 | 日韩综合色| 国产精品毛片一区二区 | 成人深夜网站 | 国产91对白在线播放 | 美女屁股无遮挡 | 妺妺窝人体色www在线小说 | 日日骚一区 | 不卡三区 | 国产一区免费视频 | 国产成人免费 | 免费日批视频 | 处破痛哭a√18成年片免费 | 精品国产一级片 | 6080久久| 美腿丝袜一区二区三区 | 亚洲精品国产乱伦 | 亚洲精品乱码久久久久99 | 久久天| 欧美精品欧美精品系列 | 久久这里只有精品首页 | 国产成人一区二区三区 | 少妇福利在线 | 一卡二卡三卡四卡 | 干日本少妇 | 惊艳大片mv视频 | 胸网站| 99自拍网 | 爱综合网 | 婷婷色婷婷 | 久久久资源网 | 欧美a在线播放 | 国产美女福利 | 欧美日韩大陆 | 91成人亚洲| av不卡免费在线 | av中文字幕网站 | 亚洲美女自拍偷拍 | 日韩欧美在线看 | 在线播放少妇奶水过盛 | 夜夜嗨av一区二区三区免费区 | 日本午夜一区二区 | 国产二区自拍 | 99热这里只有精品3 成年人黄色网址 | 国产九九精品视频 | 欧美aa级 | 久久成人av| 精品中文字幕一区二区三区 | a毛片视频 | 开心春色激情网 | 欧美在线一区二区三区 | 日韩操| 色偷偷噜噜噜亚洲男人的天堂 | 欧美偷拍少妇精品一区 | 精品网站999www | 久久精品国产77777蜜臀 | 欧美色就是色 | 黄色一级视频在线观看 | 91精品久久久久久粉嫩 | 成人性生交大片免费看r链接 | av色在线 | 久久99精品久久久久子伦 | 在线观看日本网站 | 不卡中文字幕在线观看 | 91精品国自产在线观看 | 久久五月视频 | 国产超碰av| xxxwww在线观看 | 国产精品成人在线观看 | 欧洲一区二区在线 | 久久久久人妻精品一区二区三区 | 国产精品久久久久三级无码 | 久久久久久伦理 | 秋霞av在线 | 超碰导航 | 久久超碰av | 日韩在线一区二区三区四区 | 国产精品色片 | 啪啪日韩 | 草草地址线路①屁屁影院成人 | 天堂а√在线中文在线 | 亚洲av毛片基地 | 日韩不卡免费视频 | 中文字幕黄色片 | 奇米中文字幕 | 色片免费看 | 尤物久久 |