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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++——《算法分析》实验贰——最长公共子序列问题

發(fā)布時(shí)間:2025/3/15 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++——《算法分析》实验贰——最长公共子序列问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

實(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ī)劃基本步驟:

  • 找出最優(yōu)解的性質(zhì),并刻畫(huà)其結(jié)構(gòu)特征。
  • 遞歸地定義最優(yōu)值。
  • 以自底向上的方式計(jì)算出最優(yōu)值。
  • 根據(jù)計(jì)算最優(yōu)值時(shí)得到的信息,構(gòu)造最優(yōu)解。
  • 前三個(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)代碼:

    #include<iostream> #include<string> #define s 100 using namespace std; int b[s][s]; int c[s][s]; void longest(int m,int n,char text1[], char text2[]) {for (int i = 0; i <= m; i++) c[i][0] = 0;for (int j = 0; j <= n; j++) c[0][j] = 0;for (int i = 1; i <= m; i++){for (int j = 1; j <= n; j++){if (text1[i-1] == text2[j-1]){c[i][j] = c[i - 1][j - 1] + 1;b[i][j] = 1; }else{if (c[i][j - 1] >= c[i - 1][j]){c[i][j] = c[i][j - 1];b[i][j] = 2;}else{c[i][j] = c[i - 1][j];b[i][j] = 3;}}}} } void print(string text1, int p, int q) {if (p == 0 || q == 0) return;if (b[p][q] == 1){print(text1, p - 1, q - 1);cout << text1[p-1];}else if (b[p][q] == 2){print(text1, p , q-1);}else print(text1, p-1, q ); }int main() {char text1[s], text2[s];cout << "請(qǐng)輸入第一個(gè)字符串:";cin >> text1;cout << "請(qǐng)輸入第二個(gè)字符串:";cin >> text2;int m = strlen(text1);int n = strlen(text2);cout << "公共子序列為:";longest(m,n,text1, text2);print(text1, m, n);return 0; }

    實(shí)驗(yàn)結(jié)果:

    總結(jié)

    以上是生活随笔為你收集整理的C++——《算法分析》实验贰——最长公共子序列问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。