動(dòng)態(tài)規(guī)劃

動(dòng)態(tài)規(guī)劃應(yīng)用場(chǎng)景

求一個(gè)問(wèn)題的最優(yōu)解(通常是求最大值或者最小值),而且該問(wèn)題能夠分解成若干個(gè)子問(wèn)題祠锣,并且子問(wèn)題之間還有重疊的更小的子問(wèn)題绒障,就可以考慮用動(dòng)態(tài)規(guī)劃來(lái)解決。

相對(duì)遞歸的優(yōu)勢(shì)

相同的問(wèn)題使用動(dòng)態(tài)規(guī)劃喘帚,可避免子問(wèn)題重復(fù)計(jì)算,極大減小空間復(fù)雜度咒钟。

動(dòng)態(tài)規(guī)劃解題思路
  1. 確定狀態(tài)
    ? 研究最優(yōu)策略的最后一步
    ? 優(yōu)化為子問(wèn)題
  2. 轉(zhuǎn)移方程
    ? 根據(jù)子問(wèn)題定義直接得到
  3. 初始條件和邊界情況
    ? 仔細(xì)吹由,考慮周全
  4. 計(jì)算順序
    ? 利用之前的計(jì)算結(jié)果
硬幣問(wèn)題
遞歸
static int coinChangeRecall(int amount, int[] coins) {
    if (amount == 0) return 0;
    int res = 14;
    for (int coin : coins) {
        if (amount >= coin) {
            res = Integer.min(res, coinChangeRecall(amount - coin, coins) + 1);
        }
    }
    return res;
}
動(dòng)態(tài)規(guī)劃
static int coinChange(int[] coins, int amount) {
    int[] init = new int[amount + 1];
    init[0] = 0;
    for (int i = 1; i <= amount; i++) {
        init[i] = Integer.MAX_VALUE;
        for (int coin : coins) {
            if (i >= coin && init[i - coin] != Integer.MAX_VALUE) {
                init[i] = Math.min(init[i - coin] + 1, init[i]);
            }
        }
    }
    if (init[amount] == Integer.MAX_VALUE) {
        init[amount] = -1;
    }
    return init[amount];

}
背包問(wèn)題
遞歸
static int maxPackageValueRecall(int packageSpace, int[][] goods) {
    if (packageSpace == 0) return 0;
    int res = 0;
    for (int[] good : goods) {
        if (packageSpace > good[0]) {
            res = Integer.max(res, maxPackageValueRecall(packageSpace - good[0], goods) + good[1]);
        }
    }
    return res;
}
動(dòng)態(tài)規(guī)劃
static int maxPackageValue(int packageSpace, int[][] goods) {
    int[] init = new int[packageSpace + 1];
    init[0] = 0;
    for (int s = 1; s <= packageSpace; s++) {
        init[s] = 0;
        for (int[] good : goods) {
            if (good[0] < s) {
                init[s] = Math.max(init[s - good[0]] + good[1], init[s]);
            }
        }
    }
    return init[packageSpace];
}
斐波那契數(shù)列
遞歸
static int fibRecall(int n) {
    if (n == 1 || n == 2) return 1;
    else {
        return fibRecall(n - 1) + fibRecall(n - 2);
    }
}
動(dòng)態(tài)規(guī)劃
static int fib(int n) {
    int[] init = new int[n + 1];
    init[1] = 1;
    init[2] = 1;
    for (int i = 3; i <= n; i++) {
        init[i] = init[i - 1] + init[i - 2];
    }
    return init[n];
}
唯一路徑 動(dòng)態(tài)規(guī)劃
static int GetUniqueRoadCount(int m, int n) {
    int[][] init = new int[m][n];
    int i, j;
    for (i = 0; i < m; i++) {
        for (j = 0; j < n; j++) {
            if (i == 0 || j == 0) {
                init[i][j] = 1;
            } else {
                init[i][j] = init[i - 1][j] + init[i][j - 1];
            }
        }
    }
    return init[m - 1][n - 1];
}
最短步數(shù) 動(dòng)態(tài)規(guī)劃
static int minStep(int[] stepLengths, int sumLength) {
    int[] init = new int[sumLength + 1];
    init[0] = 0;
    for (int i = 1; i <= sumLength; i++) {
        init[i] = Integer.MAX_VALUE;
        for (int j : stepLengths) {
            if (i >= j && init[i - j] != Integer.MAX_VALUE) {
                init[i] = Math.min(init[i], init[i - j] + 1);
            }
        }
    }
    if (init[sumLength] == Integer.MAX_VALUE) {
        return -1;
    }
    return init[sumLength];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市朱嘴,隨后出現(xiàn)的幾起案子倾鲫,更是在濱河造成了極大的恐慌,老刑警劉巖萍嬉,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乌昔,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡壤追,警方通過(guò)查閱死者的電腦和手機(jī)磕道,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)行冰,“玉大人溺蕉,你說(shuō)我怎么就攤上這事〉孔觯” “怎么了疯特?”我有些...
    開(kāi)封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)贿堰。 經(jīng)常有香客問(wèn)我辙芍,道長(zhǎng),這世上最難降的妖魔是什么羹与? 我笑而不...
    開(kāi)封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任故硅,我火速辦了婚禮,結(jié)果婚禮上纵搁,老公的妹妹穿的比我還像新娘吃衅。我一直安慰自己,他們只是感情好腾誉,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布徘层。 她就那樣靜靜地躺著峻呕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪趣效。 梳的紋絲不亂的頭發(fā)上瘦癌,一...
    開(kāi)封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音跷敬,去河邊找鬼讯私。 笑死,一個(gè)胖子當(dāng)著我的面吹牛西傀,可吹牛的內(nèi)容都是我干的斤寇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼拥褂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼娘锁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起饺鹃,我...
    開(kāi)封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤莫秆,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后尤慰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體馏锡,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雷蹂,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年伟端,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片匪煌。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡责蝠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出萎庭,到底是詐尸還是另有隱情霜医,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布驳规,位于F島的核電站肴敛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吗购。R本人自食惡果不足惜医男,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捻勉。 院中可真熱鬧镀梭,春花似錦、人聲如沸踱启。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至透罢,卻和暖如春榜晦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背羽圃。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工芽隆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人统屈。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓胚吁,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親愁憔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子腕扶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • # 先來(lái)說(shuō)幾個(gè)動(dòng)態(tài)規(guī)劃問(wèn)題中的術(shù)語(yǔ): 動(dòng)態(tài)規(guī)劃(dynamic programming)是運(yùn)籌學(xué)的一個(gè)分支,是求解...
    Tenloy閱讀 2,343評(píng)論 0 3
  • 一吨掌、貪心算法 參考算法(一):貪心[https://zhuanlan.zhihu.com/p/25769975] ...
    合肥黑閱讀 4,075評(píng)論 0 7
  • 從運(yùn)籌學(xué)和算法的角度綜合介紹動(dòng)態(tài)規(guī)劃 算法分類總結(jié)動(dòng)態(tài)規(guī)劃與靜態(tài)規(guī)劃的關(guān)系淺析靜態(tài)規(guī)劃和動(dòng)態(tài)規(guī)劃動(dòng)態(tài)規(guī)劃解非線性規(guī)...
    RoyTien閱讀 1,583評(píng)論 0 1
  • 和分治法一樣半抱,動(dòng)態(tài)規(guī)劃(dynamic programming)是通過(guò)組合子問(wèn)題而解決整個(gè)問(wèn)題的解。 分治法是將問(wèn)...
    Teci閱讀 5,650評(píng)論 0 70
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月膜宋,有人笑有人哭窿侈,有人歡樂(lè)有人憂愁,有人驚喜有人失落秋茫,有的覺(jué)得收獲滿滿有...
    陌忘宇閱讀 8,544評(píng)論 28 53