數(shù)據(jù)結(jié)構(gòu)&算法之動(dòng)態(tài)規(guī)劃(深度優(yōu)先遍歷)

最近在看關(guān)于數(shù)據(jù)結(jié)構(gòu)系列知識(shí)點(diǎn)贫堰,然后遇到一個(gè)動(dòng)態(tài)規(guī)劃相關(guān)的題目——郵票規(guī)劃坤按。
首先先介紹下關(guān)于DPS弃衍,也就是深度優(yōu)先遍歷算法吧惊豺。

深度優(yōu)先遍歷

深度優(yōu)先遍歷燎孟,從初始訪問(wèn)結(jié)點(diǎn)出發(fā),我們知道初始訪問(wèn)結(jié)點(diǎn)可能有多個(gè)鄰接結(jié)點(diǎn)扮叨,深度優(yōu)先遍歷的策略就是首先訪問(wèn)第一個(gè)鄰接結(jié)點(diǎn)缤弦,然后再以這個(gè)被訪問(wèn)的鄰接結(jié)點(diǎn)作為初始結(jié)點(diǎn),訪問(wèn)它的第一個(gè)鄰接結(jié)點(diǎn)彻磁“澹總結(jié)起來(lái)可以這樣說(shuō):每次都在訪問(wèn)完當(dāng)前結(jié)點(diǎn)后首先訪問(wèn)當(dāng)前結(jié)點(diǎn)的第一個(gè)鄰接結(jié)點(diǎn)。

一句話的事情:優(yōu)先進(jìn)行縱向訪問(wèn)衷蜓,而不是廣度優(yōu)先遍歷的橫向進(jìn)行訪問(wèn)

動(dòng)態(tài)規(guī)劃相關(guān)知識(shí)點(diǎn)

動(dòng)態(tài)規(guī)劃算法的基本思想是:將帶求解的問(wèn)題分解成若干個(gè)相互聯(lián)系的子問(wèn)題累提,先求解子問(wèn)題,然后從這些子問(wèn)題的解中得到原問(wèn)題的解磁浇;對(duì)于重復(fù)出現(xiàn)的子問(wèn)題斋陪,只在第一次遇到的時(shí)候?qū)λM(jìn)行求解,并把答案保存起來(lái),避免重復(fù)求解无虚。該思想與記憶化搜索類似缔赠,即將計(jì)算步驟中的過(guò)程保存下來(lái),避免重復(fù)運(yùn)算

要點(diǎn)

  • 動(dòng)態(tài)規(guī)劃適用于這些子問(wèn)題不是獨(dú)立的情況友题,也就是各子問(wèn)題包含公共子問(wèn)題
  • 需要記錄每個(gè)子問(wèn)題求解的問(wèn)題結(jié)果嗤堰,以供其他問(wèn)題進(jìn)行解決

相關(guān)步驟

  1. 劃分階段:按照問(wèn)題的時(shí)間或空間特征,把問(wèn)題分為若干個(gè)階段度宦。在劃分階段時(shí)踢匣,注意劃分后的階段一定要是有序的或者是可排序的,否則問(wèn)題就無(wú)法求解戈抄。
  2. 確定狀態(tài)和狀態(tài)變量:注意狀態(tài)必須滿足無(wú)后效性离唬。
  3. 確定決策:找到子問(wèn)題是進(jìn)行動(dòng)態(tài)規(guī)劃的重要一步。動(dòng)態(tài)規(guī)劃和遞推更多應(yīng)考慮本問(wèn)題由哪些已解決子問(wèn)題構(gòu)成划鸽,而不是考慮本問(wèn)題對(duì)將來(lái)哪些問(wèn)題有貢獻(xiàn)输莺。
  4. 確定邊界條件,寫(xiě)出狀態(tài)轉(zhuǎn)移方程

具體事例

問(wèn)題描述
  給定一個(gè)信封裸诽,最多只允許粘貼N張郵票模闲,計(jì)算在給定K(N+K≤13)種郵票的情況下(假定所有的郵票數(shù)量都足夠),如何設(shè)計(jì)郵票的面值崭捍,能得到最大值MAX尸折,使在1~MAX之間的每一個(gè)郵資值都能得到。

例如殷蛇,N=3实夹,K=2,如果面值分別為1分粒梦、4分亮航,則在1分~6分之間的每一個(gè)郵資值都能得到(當(dāng)然還有8分、9分和12分)匀们;如果面值分別為1分缴淋、3分,則在1分~7分之間的每一個(gè)郵資值都能得到泄朴≈囟叮可以驗(yàn)證當(dāng)N=3,K=2時(shí)祖灰,7分就是可以得到的連續(xù)的郵資最大值钟沛,所以MAX=7,面值分別為1分局扶、3分恨统。
輸入格式
  一行叁扫,兩個(gè)數(shù)N、K
輸出格式
  兩行畜埋,第一行升序輸出設(shè)計(jì)的郵票面值莫绣,第二行輸出“MAX=xx”(不含引號(hào)),其中xx為所求的能得到的連續(xù)郵資最大值悠鞍。
樣例輸入
3 2
樣例輸出
1 3
MAX=7

當(dāng)看到這個(gè)問(wèn)題我們藉由之前的理論來(lái)具體分析下兔综。

動(dòng)態(tài)規(guī)劃
  • 子問(wèn)題
    • 是否選擇面值各大的郵票呢,這里顯示選擇只能“是”或者“否”
  • 最優(yōu)子結(jié)構(gòu)
    • 當(dāng)然同理狞玛,連續(xù)郵票的面值在每個(gè)值下都成立,這樣就構(gòu)成了結(jié)構(gòu)涧窒。
  • 邊界
    郵票的種類數(shù)目

當(dāng)然有了上面的幾點(diǎn)心肪,我們?cè)囍鴮?xiě)下該方式的轉(zhuǎn)化方程,假如n代表郵票總共類別纠吴,i代表郵票總面值硬鞍,stamp[i]代表郵票所屬值大小,dp[i]代表湊齊 i 面值最少需要多少郵票戴已,Dp(int position)代表幾種類別的所能組成郵票值固该。

  • 當(dāng)i >= stamp[k] && dp[i] > dp[i - stamp[k]] + 1,則 dp[i] = dp[i - stamp[k]] + 1;就是說(shuō)取最大的那個(gè)糖儡。
    • 當(dāng)dp[i]>n伐坏,Dp(position)=i,
    • 當(dāng)dp[i]<n,Dp(postion)=-1;就是說(shuō)無(wú)意義
DPS的使用
  • deep深度——由于每個(gè)郵件的類別數(shù)目難以確定,所以需要以郵票數(shù)目為DPS的遞歸深度deep)
  • 中止條件——當(dāng)確定最大連續(xù)能取得值maxm握联,那么新加入的物品價(jià)值一旦大于maxm+1桦沉,顯然就會(huì)出現(xiàn)斷層,所以可以以maxm+1為枚舉上界金闽,然后這樣進(jìn)行下一層的dfs纯露。

附上java代碼:

import java.util.Arrays;
import java.util.Scanner;

public class Main {
    static int N=500;
    static  int n,m,ans;
    static  int a[]=new int[N+1];
    static  int b[]=new int[N+1];
    static  int f[]=new int[N+1];
    public static void main(String[] args) {
        int i,j,k;
        Scanner scanner =new Scanner(System.in);
        n=scanner.nextInt();
        m=scanner.nextInt();
        a[1]=1;
        dfs(1);
        for(i=1;i<=m;i++)
            System.out.printf("%d ",b[i]);
        System.out.printf("\nMAX=%d\n",ans);
    }
    static void dfs(int deep)
    {
        int i,j,uplimit;
        Arrays.fill(f,0x3f);
        f[0]=0;
        for(uplimit=1;uplimit<=N;uplimit++)
        {
            for(i=1;i<=deep&&a[i]<=uplimit;i++)
                f[uplimit]=Math.min(f[uplimit],f[uplimit-a[i]]+1);
            if(f[uplimit]>n)
            {
                uplimit--;
                if(uplimit>ans)
                {
                    ans=uplimit;
                    for(i=1;i<=deep;i++)
                        b[i]=a[i];
                }
                break;
            }
        }
        if(deep==m)return ;
        for(i=uplimit+1;i>a[deep];i--)
        {
            a[deep+1]=i;
            dfs(deep+1);
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市代芜,隨后出現(xiàn)的幾起案子埠褪,更是在濱河造成了極大的恐慌,老刑警劉巖挤庇,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钞速,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡嫡秕,警方通過(guò)查閱死者的電腦和手機(jī)玉工,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)淘菩,“玉大人遵班,你說(shuō)我怎么就攤上這事屠升。” “怎么了狭郑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵腹暖,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我翰萨,道長(zhǎng)脏答,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任亩鬼,我火速辦了婚禮殖告,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘雳锋。我一直安慰自己黄绩,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布玷过。 她就那樣靜靜地躺著爽丹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辛蚊。 梳的紋絲不亂的頭發(fā)上粤蝎,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音袋马,去河邊找鬼初澎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛虑凛,可吹牛的內(nèi)容都是我干的谤狡。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼卧檐,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼墓懂!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起霉囚,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤捕仔,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后盈罐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體榜跌,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年盅粪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钓葫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡票顾,死狀恐怖础浮,靈堂內(nèi)的尸體忽然破棺而出帆调,到底是詐尸還是另有隱情,我是刑警寧澤豆同,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布番刊,位于F島的核電站,受9級(jí)特大地震影響影锈,放射性物質(zhì)發(fā)生泄漏芹务。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一鸭廷、第九天 我趴在偏房一處隱蔽的房頂上張望枣抱。 院中可真熱鬧,春花似錦辆床、人聲如沸佳晶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至垂攘,卻和暖如春维雇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晒他。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工吱型, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人陨仅。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓津滞,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親灼伤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子触徐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 動(dòng)態(tài)規(guī)劃(Dynamic Programming) 本文包括: 動(dòng)態(tài)規(guī)劃定義 狀態(tài)轉(zhuǎn)移方程 動(dòng)態(tài)規(guī)劃算法步驟 最長(zhǎng)...
    廖少少閱讀 3,270評(píng)論 0 18
  • 課程介紹 先修課:概率統(tǒng)計(jì),程序設(shè)計(jì)實(shí)習(xí)狐赡,集合論與圖論 后續(xù)課:算法分析與設(shè)計(jì)撞鹉,編譯原理,操作系統(tǒng)颖侄,數(shù)據(jù)庫(kù)概論鸟雏,人...
    ShellyWhen閱讀 2,270評(píng)論 0 3
  • 因?yàn)橹熬蛷?fù)習(xí)完數(shù)據(jù)結(jié)構(gòu)了,所以為了保持記憶览祖,整理了一份復(fù)習(xí)綱要孝鹊,復(fù)習(xí)的時(shí)候可以看著綱要想具體內(nèi)容。 樹(shù) 樹(shù)的基本...
    牛富貴兒閱讀 6,840評(píng)論 3 10
  • 樹(shù)形動(dòng)態(tài)規(guī)劃展蒂,顧名思義就是樹(shù)+DP又活,先分別回顧一下基本內(nèi)容吧:動(dòng)態(tài)規(guī)劃:?jiǎn)栴}可以分解成若干相互聯(lián)系的階段苔咪,在每一個(gè)...
    Mr_chong閱讀 1,478評(píng)論 0 2
  • VisuAlgo!一,Date Structure的核心技術(shù)是分解和抽象二皇钞,基本概念和常用術(shù)語(yǔ) 三悼泌,邏輯結(jié)構(gòu)1,邏...
    斜杠青年許晏銘閱讀 878評(píng)論 0 0