C++——《算法分析》实验贰——最长公共子序列问题
實(shí)驗(yàn)?zāi)康?#xff1a;
1、理解動(dòng)態(tài)規(guī)劃算法的概念;
2、掌握動(dòng)態(tài)規(guī)劃算法的基本要素;
3、掌握設(shè)計(jì)動(dòng)態(tài)規(guī)劃算法的步驟;
4、通過(guò)應(yīng)用范例學(xué)習(xí)動(dòng)態(tài)規(guī)劃算法的設(shè)計(jì)技巧與策略;
實(shí)驗(yàn)原理:
動(dòng)態(tài)規(guī)劃是運(yùn)籌學(xué)的一個(gè)分支,是求解決策過(guò)程最優(yōu)化的數(shù)學(xué)方法。20世紀(jì)50年代初美國(guó)數(shù)學(xué)家R.E.Bellman等人在研究多階段決策過(guò)程的優(yōu)化問(wèn)題時(shí),提出了著名的最優(yōu)化原理,把多階段過(guò)程轉(zhuǎn)化為一系列單階段問(wèn)題,利用各階段之間的關(guān)系,逐個(gè)求解,創(chuàng)立了解決這類(lèi)過(guò)程優(yōu)化問(wèn)題的新方法——?jiǎng)討B(tài)規(guī)劃。1957年出版了他的名著Dynamic Programming,這是該領(lǐng)域的第一本著作。
算法總體思想:
1)動(dòng)態(tài)規(guī)劃算法與分治法類(lèi)似,其基本思想也是將待求解問(wèn)題分解成若干個(gè)子問(wèn)題,先求解子問(wèn)題,然后從這些子問(wèn)題的解得到原問(wèn)題的解。
2)與分治法不同的是,適合于用動(dòng)態(tài)規(guī)劃法求解的問(wèn)題,經(jīng)分解得到的子問(wèn)題往往不是獨(dú)立的。子問(wèn)題中存在大量的公共子問(wèn)題,在分治求解過(guò)程中被多次重復(fù)計(jì)算,保存計(jì)算結(jié)果,為后面的計(jì)算直接引用,減少重復(fù)計(jì)算次數(shù)這就是動(dòng)態(tài)規(guī)劃的基本思想。
3)用動(dòng)態(tài)規(guī)劃算法求解問(wèn)題,可依據(jù)其遞歸式以自底向上的方式進(jìn)行計(jì)算。在計(jì)算過(guò)程中,保存已解決的子問(wèn)題的答案。每個(gè)子問(wèn)題只計(jì)算一次,而在后面需要時(shí)只要簡(jiǎn)單查一下,從而避免大量重復(fù)計(jì)算,最終得到多項(xiàng)式時(shí)間算法。
動(dòng)態(tài)規(guī)劃基本步驟:
前三個(gè)步驟是動(dòng)態(tài)規(guī)劃算法的基本步驟。在只需求出最優(yōu)值的情況,步驟四可以省去。若需要求最優(yōu)解,則必須執(zhí)行步驟四,根據(jù)所記錄的信息,快速構(gòu)造出最優(yōu)解。
實(shí)驗(yàn)內(nèi)容:
1、使用動(dòng)態(tài)規(guī)劃算法解決最長(zhǎng)公共子序列問(wèn)題:給定兩個(gè)序列X={x1,x2,…,xm}和Y={y1,y2,…,yn},找出X和Y的最長(zhǎng)公共子序列。。
2、通過(guò)上機(jī)實(shí)驗(yàn)進(jìn)行算法實(shí)現(xiàn)。
3、保存和打印出程序的運(yùn)行結(jié)果,并結(jié)合程序進(jìn)行分析,上交實(shí)驗(yàn)報(bào)告。
實(shí)驗(yàn)代碼:
實(shí)驗(yàn)結(jié)果:
總結(jié)
以上是生活随笔為你收集整理的C++——《算法分析》实验贰——最长公共子序列问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Delphi中PCAHR的妙用
- 下一篇: C/C++中涉及存储方式的关键字:aut