摘要:介紹動(dòng)態(tài)規(guī)劃簡(jiǎn)稱是算法設(shè)計(jì)思想當(dāng)中最難也是最有趣的部分了,動(dòng)態(tài)規(guī)劃適用于有重疊子問(wèn)題和最優(yōu)子結(jié)構(gòu)性質(zhì)的問(wèn)題,是一種在數(shù)學(xué)計(jì)算機(jī)科學(xué)和經(jīng)濟(jì)學(xué)中經(jīng)常使用的,通過(guò)把原問(wèn)題分解為相對(duì)簡(jiǎn)單的子問(wèn)題的方式求解復(fù)雜問(wèn)題的方法。
介紹
動(dòng)態(tài)規(guī)劃(簡(jiǎn)稱DP)是算法設(shè)計(jì)思想當(dāng)中最難也是最有趣的部分了,動(dòng)態(tài)規(guī)劃適用于有重疊子問(wèn)題和最優(yōu)子結(jié)構(gòu)性質(zhì)的問(wèn)題,是一種在數(shù)學(xué)、計(jì)算機(jī)科學(xué)和經(jīng)濟(jì)學(xué)中經(jīng)常使用的,通過(guò)把原問(wèn)題分解為相對(duì)簡(jiǎn)單的子問(wèn)題的方式求解復(fù)雜問(wèn)題的方法。使用動(dòng)態(tài)規(guī)劃方法解題有較高的時(shí)間效率,關(guān)鍵在于它減少了很多不必要的計(jì)算和重復(fù)計(jì)算的部分
它的思想就是把一個(gè)大的問(wèn)題進(jìn)行拆分,細(xì)分成一個(gè)個(gè)小的子問(wèn)題,且能夠從這些小的子問(wèn)題的解當(dāng)中推導(dǎo)出原問(wèn)題的解。同時(shí)還需要滿足以下兩個(gè)重要性質(zhì)才能進(jìn)行動(dòng)態(tài)規(guī)劃
最優(yōu)子結(jié)構(gòu)性: 既所拆分的子問(wèn)題的解是最優(yōu)解。
子問(wèn)題重疊性質(zhì): 既在求解的過(guò)程當(dāng)中,每次產(chǎn)生的子問(wèn)題并不總是新問(wèn)題,有些子問(wèn)題會(huì)被重復(fù)計(jì)算多次。動(dòng)態(tài)規(guī)劃算法正是利用了這種子問(wèn)題的重疊性質(zhì),對(duì)每一個(gè)子問(wèn)題只計(jì)算一次,然后將其計(jì)算結(jié)果保存在一個(gè)表格中,當(dāng)再次需要計(jì)算已經(jīng)計(jì)算過(guò)的子問(wèn)題時(shí),只是在表格中簡(jiǎn)單地查看一下結(jié)果,從而獲得較高的解題效率
舉個(gè)栗子首先先引一道動(dòng)態(tài)規(guī)劃的經(jīng)典問(wèn)題最長(zhǎng)不下降子序列
它的定義是: 設(shè)有由n個(gè)不相同的整數(shù)組成的數(shù)列b[n],若有下標(biāo)$i_1 例如 13,7,9,16,38,24,37,18,44,19,21,22,63,15 那么就有13<16<38<44<63長(zhǎng)度為5的不下降子序列。 輸入格式 第一行為n,表示n個(gè)數(shù)(n<=100000),第二行為n個(gè)數(shù)的數(shù)值(數(shù)字之間用空格隔開(kāi)且最后一個(gè)數(shù)字末尾不能留有空格) 輸出格式 一個(gè)整數(shù),表示最長(zhǎng)不下降子序列的長(zhǎng)度。 輸入例子 4 1 3 1 2 輸出例子 2 思路 假如要求得某一段的最優(yōu),就要想更小段的最優(yōu)怎么求,再看看由最小段的最優(yōu)能否擴(kuò)大推廣到最大段的最優(yōu); 假設(shè)這么一個(gè)表: 第三行表示該序列元素的所能連接的最長(zhǎng)不下降子序列的長(zhǎng)度,因?yàn)楸旧黹L(zhǎng)度為1,所以初始值都為1 第四行表示鏈接于哪個(gè)序列元素形成最長(zhǎng)不下降子序列 先從倒數(shù)第二項(xiàng)63算起,在它的后面僅有一項(xiàng),因此僅作一次比較,因?yàn)?3>15,所以從63出發(fā),不作任何鏈接,長(zhǎng)度還是為1。 再看倒數(shù)第三項(xiàng)22,在它的后面有2項(xiàng),因此必須要在這2項(xiàng)當(dāng)中找出比22大,長(zhǎng)度又是最長(zhǎng)的數(shù)值作為鏈接,由于只有22<63,所以修改22的長(zhǎng)度為2,即自身長(zhǎng)度加上所鏈接數(shù)值的長(zhǎng)度,并修改鏈接位置為13,也就是63的下標(biāo)。 再看倒數(shù)第四項(xiàng)21,在它的后面有3項(xiàng),因此必須要在這3項(xiàng)當(dāng)中找出比21大,長(zhǎng)度又是最長(zhǎng)的數(shù)值作為鏈接(注意:是長(zhǎng)度),很容易看出,數(shù)值22滿足該條件,因此,修改21的長(zhǎng)度為3,并修改鏈接位置為12,即22的序列下標(biāo)。 依次類推,最后結(jié)果如下表: 最終狀態(tài)的轉(zhuǎn)移方程式為: $f(i) = max {f(j)} +1 (b_j 代碼
但是經(jīng)過(guò)觀察實(shí)際上還有7<9<16<18<19<21<22<63長(zhǎng)度為8的不下降子序列,那么是否還有更長(zhǎng)的不下降子序列呢?請(qǐng)找出最長(zhǎng)的不下降子序列
process.stdin.setEncoding("utf8");
var arr = [];
var bool = 0;
var n = 0;
var longest = 1;
var a = [];
var dp = [];
process.stdin.on("readable", function() {
var chunk = process.stdin.read();
if (chunk !== null) {
arr.push(chunk.trim())
}
if(bool>=2){
n = arr[0];
process.stdin.emit("end")
}
bool++
});
process.stdin.on("end", function() {
a = arr.slice(1).join(" ").split(" ").map(function(index, elem) {
return parseInt(index);
})
for(let i = 0;i
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/81370.html
摘要:代碼實(shí)現(xiàn)見(jiàn)下面評(píng)論對(duì)應(yīng)代碼動(dòng)態(tài)規(guī)劃基本思想和分治法基本思想有共同的地方,不同的是子問(wèn)題往往不是獨(dú)立的,有事母問(wèn)題要借助子問(wèn)題的解來(lái)判斷,因此把已經(jīng)計(jì)算好的問(wèn)題記錄在表格中,后續(xù)如果需要查詢一下,可以避免重復(fù)計(jì)算,這是動(dòng)態(tài)規(guī)劃的基本思想。 作者:心葉時(shí)間:2018-05-01 19:28 本文對(duì)應(yīng)github地址:https://github.com/yelloxing/... 以上實(shí)現(xiàn)...
摘要:我記得大三參加騰訊的校招面試時(shí)只準(zhǔn)備了幾種常見(jiàn)的排序算法就足以應(yīng)對(duì)了,然而今年包括今日頭條在內(nèi)的多家大廠的前端筆試題目中都出現(xiàn)了貪心算法動(dòng)態(tài)規(guī)劃分治算法等進(jìn)階性的算法題目。本篇博客參考今日頭條銀國(guó)徽老師的《js版數(shù)據(jù)結(jié)構(gòu)與算法》Part1改編自《漫畫(huà)算法》原作者:程序員小灰前言眾所周知,與后臺(tái)開(kāi)發(fā)人員相比,算法是我們前端開(kāi)發(fā)人員的一個(gè)弱項(xiàng)。而近兩年隨著互聯(lián)網(wǎng)行業(yè)競(jìng)爭(zhēng)愈發(fā)激烈,市場(chǎng)上對(duì)前端崗位...
摘要:大名鼎鼎的斐波那契數(shù)列,,,,,,,,使用數(shù)學(xué)歸納法可以看出其規(guī)律為。對(duì)于斐波那契數(shù)列的求解,有自頂向下的記憶化搜索遞歸和自下向上的迭代法,他們都使用了動(dòng)態(tài)規(guī)劃的思想。 大名鼎鼎的斐波那契數(shù)列:0,1,1,2,3,5,8,13,21...使用數(shù)學(xué)歸納法可以看出其規(guī)律為:f(n) = f(n-1) + f(n-2)。 遞歸 下面首先直接使用遞歸(JavaScript實(shí)現(xiàn))來(lái)求解第 n ...
摘要:動(dòng)態(tài)規(guī)劃算法通?;谝粋€(gè)遞推公式及一個(gè)或多個(gè)初始狀態(tài)。動(dòng)態(tài)規(guī)劃有三個(gè)核心元素最優(yōu)子結(jié)構(gòu)邊界狀態(tài)轉(zhuǎn)移方程我們來(lái)看一到題目題目有一座高度是級(jí)臺(tái)階的樓梯,從下往上走,每跨一步只能向上級(jí)或者級(jí)臺(tái)階。 概念 動(dòng)態(tài)規(guī)劃(dynamic programming)是運(yùn)籌學(xué)的一個(gè)分支,是求解決策過(guò)程(decision process)最優(yōu)化的數(shù)學(xué)方法。動(dòng)態(tài)規(guī)劃算法通?;谝粋€(gè)遞推公式及一個(gè)或多個(gè)初始狀態(tài)...
閱讀 1395·2021-11-25 09:43
閱讀 815·2021-11-18 10:02
閱讀 3025·2021-09-07 09:59
閱讀 2819·2021-08-30 09:44
閱讀 2976·2019-08-30 13:17
閱讀 2372·2019-08-29 12:17
閱讀 1731·2019-08-28 17:57
閱讀 1342·2019-08-26 14:04