国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

算法分析與設(shè)計(jì)---分治+動(dòng)態(tài)規(guī)劃

這篇具有很好參考價(jià)值的文章主要介紹了算法分析與設(shè)計(jì)---分治+動(dòng)態(tài)規(guī)劃。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1.分治法

適用條件:

  • 問(wèn)題規(guī)模縮小到一定程度容易求解
  • 問(wèn)題可以分解為若干個(gè)規(guī)模較小的相同子問(wèn)題,即問(wèn)題具有最優(yōu)子結(jié)構(gòu)(使用分治法前提
  • 可以利用子問(wèn)題的解合并為該問(wèn)題的解(決定是否使用分治法
  • 各個(gè)子問(wèn)題相互獨(dú)立,即子問(wèn)題之間不包含公共子問(wèn)題(若不滿(mǎn)足,最好使用動(dòng)態(tài)規(guī)劃算法

基本步驟:

算法分析與設(shè)計(jì)---分治+動(dòng)態(tài)規(guī)劃

2.動(dòng)態(tài)規(guī)劃算法

適用條件:

  • 滿(mǎn)足最優(yōu)性原理,即具有最優(yōu)子結(jié)構(gòu)性質(zhì)(該問(wèn)題最優(yōu)解包含子問(wèn)題最優(yōu)解
  • 重疊子問(wèn)題:可分解為相互關(guān)聯(lián)的若干子問(wèn)題,子問(wèn)題之間不獨(dú)立,子問(wèn)題的解可能在下一決策階段中被使用

設(shè)計(jì)思想:

利用最優(yōu)子結(jié)構(gòu)性質(zhì),將問(wèn)題劃分為一系列子問(wèn)題,求各子問(wèn)題的最優(yōu)解,然后以自底向上的方式遞歸地從子問(wèn)題的最優(yōu)解構(gòu)造出整個(gè)問(wèn)題的最優(yōu)解。

算法分析與設(shè)計(jì)---分治+動(dòng)態(tài)規(guī)劃

ps:“填表” ——構(gòu)建數(shù)據(jù)結(jié)構(gòu),保存子問(wèn)題的最優(yōu)解,以便求整個(gè)問(wèn)題的最優(yōu)解。

設(shè)計(jì)步驟:

(1)劃分子問(wèn)題(分段):講整個(gè)問(wèn)題劃分為若干個(gè)子問(wèn)題,找到問(wèn)題的狀態(tài),子問(wèn)題之間具有的重疊關(guān)系。

(2)構(gòu)建狀態(tài)轉(zhuǎn)移方程(分析):關(guān)聯(lián)的狀態(tài)和狀態(tài)之間相互轉(zhuǎn)換關(guān)系。(動(dòng)態(tài)規(guī)劃的關(guān)鍵

(3)存儲(chǔ)狀態(tài)的值求解(填表):設(shè)計(jì)表格(即數(shù)據(jù)結(jié)構(gòu)),以自底向上的方式計(jì)算各個(gè)子問(wèn)題的解并填表保存,實(shí)現(xiàn)動(dòng)態(tài)規(guī)劃過(guò)程。

注:判斷問(wèn)題是否使用動(dòng)態(tài)規(guī)劃算法,一定要分析問(wèn)題滿(mǎn)足最優(yōu)性原理

分析問(wèn)題是否滿(mǎn)足最優(yōu)性原理,一般用反證法

  1. 假設(shè)由問(wèn)題的最優(yōu)解導(dǎo)出的子問(wèn)題的解不是最優(yōu)的;
  2. 證明在這個(gè)假設(shè)下可構(gòu)造出比原問(wèn)題最優(yōu)解更好的解,從而導(dǎo)致矛盾。

例:

(1)多路段圖問(wèn)題

算法分析與設(shè)計(jì)---分治+動(dòng)態(tài)規(guī)劃

(2) 旅行商問(wèn)題(TSP問(wèn)題)

算法分析與設(shè)計(jì)---分治+動(dòng)態(tài)規(guī)劃

ps:動(dòng)態(tài)規(guī)劃算法例題:

1.最長(zhǎng)公共子序列(LCS)

滿(mǎn)足最優(yōu)性原理--整個(gè)問(wèn)題的最優(yōu)解包含子問(wèn)題的最優(yōu)解

證明:若X=(x1,x2.x3....xm),Y=(y1,y2,y3.....yn),且設(shè)z=(z1,z2,z3...zk)為X,Y的最長(zhǎng)公共子序列,則:

(1)若xm=yn,則zk=xm=yn,且(z1,z2,z3...z(k-1))是(x1,x2...x(m-1))和(y1,y2...y(n-1))的最長(zhǎng)公共子序列;

(2)若xm!=yn且xk!=xm,則(z1,z2,z3...zk)是(x1,x2...x(m-1))和(y1,y2...yn)的一個(gè)最長(zhǎng)公共子序列;

(3)若xm!=yn且zk!=yn,則(z1,z2,z3...zk)是(x1,x2...xm)和(y1,y2...y(n-1))的一個(gè)最長(zhǎng)公共子序列;

綜上,最長(zhǎng)公共子序列z包含序列X,Y的所有前綴的最長(zhǎng)公共子序列。故最長(zhǎng)公共子序列問(wèn)題滿(mǎn)足最優(yōu)性原理。

步驟一:劃分子問(wèn)題(分段)

設(shè)LCS((x1,x2...xi),(y1,y2...yj))為序列X=(x1,x2...xi)和Y=(y1,y2...yj)的最長(zhǎng)公共子序列。

情況1:xi=yj

LCS((x1,x2...xi),(y1,y2...yj)) = LCS((x1,x2...x(i-1)),(y1,y2...y(j-1))) +xi(或yj)

情況2:xi!=yj

LCS((x1,x2...xi),(y1,y2...yj)) =

max( LCS((x1,x2...x(i-1)),(y1,y2...yj) , LCS((x1,x2...xi),(y1,y2...y(j-1))) )

故問(wèn)題共有m*n個(gè)子問(wèn)題。

步驟二:構(gòu)建狀態(tài)轉(zhuǎn)移方程(分析)

定義二數(shù)組L,L[i][j]表示 LCS((x1,x2...xi),(y1,y2...yj)) 的長(zhǎng)度(i=1,2,3...m,j=1,2,3...n)

每考慮一個(gè)xi或yj都為動(dòng)態(tài)規(guī)劃的一個(gè)階段。

情況1:xi=yj????????? L[i][j]=L[i-1][j-1]+1

情況2:xi!=yj????? L[i][j] =max(L[i-1][j],L[i][j-1])

則狀態(tài)轉(zhuǎn)移方程為:

算法分析與設(shè)計(jì)---分治+動(dòng)態(tài)規(guī)劃

?顯然:

初始子問(wèn)題:X,Y中至少有一個(gè)空序列,即:L[0][j]=L[i][0]=0,i=1,2...m,j=1,2...n

L[i][j]是子問(wèn)題最優(yōu)解,L[m][n]是整個(gè)問(wèn)題最優(yōu)解。

?

步驟三:存儲(chǔ)狀態(tài)的值求解(填表)

基本思想:自底向上計(jì)算LCS的長(zhǎng)度

填寫(xiě)數(shù)組L的值:

算法分析與設(shè)計(jì)---分治+動(dòng)態(tài)規(guī)劃

算法設(shè)計(jì):

為了得到序列(x1,x2,x3...xm)和(y1,y2,y3...yn)最長(zhǎng)公共子序列,另設(shè)數(shù)組S,其中S[i][j]表示在計(jì)算L[i][j]過(guò)程中的搜索狀態(tài),并且有:

算法分析與設(shè)計(jì)---分治+動(dòng)態(tài)規(guī)劃

故:

①若S[i][j]=1,下一個(gè)回溯方向是S[i-1][j-1],即i=i-1,j=j-1;

②若S[i][j]=2,下一個(gè)回溯方向是S[i][j-1],即j=j-1;

③若S[i][j]=3,下一個(gè)回溯方向是S[i-1][j],即i=i-1;

算法:

算法:最長(zhǎng)公共子序列的動(dòng)態(tài)規(guī)化算法
輸入:序列X,Y
輸出:最長(zhǎng)公共子序列長(zhǎng)度和最長(zhǎng)公共子系列z

1.for(i=0;i<=m;i++)  L[i][0] = 0;
  for(j=1;j<=n;j++)  L[0][j] = 0;
2.for(i=1;i<=m;i++)
    for(j=1;j<=n;j++)
       if(X[i]==Y[j])  {L[i][j] = L[i-1][j-1]+1; S[i][j]=1;}
       else 
        {
           if(L[i][j-1]>=L[i-1][j])  {L[i][j] = L[i][j-1]; S[i][j]=2;}
           else {L[i][j]=L[i-1][j]; S[i][j]=3;}
        }
3.i=m,j=n,k=L[m][n];
4.while(i>0&&j>0)
{
   if(S[i][j]==1) {z[k]=X[i]; i--;j--;}
   else if(S[i][j]==2) j--;
   else  i--;

}
5.輸出L[m][n]和z


時(shí)間復(fù)雜度:O(m*n)

2.最大子段和問(wèn)題

問(wèn)題:給定n個(gè)數(shù)(可以為負(fù)數(shù))的序列(a1,a2,...an),求算法分析與設(shè)計(jì)---分治+動(dòng)態(tài)規(guī)劃

①子問(wèn)題界定:前邊界1,后邊界i,C[i]是A[1...i]中包含元素A[i]的向前連續(xù)延伸的最大子段和

算法分析與設(shè)計(jì)---分治+動(dòng)態(tài)規(guī)劃

②構(gòu)建狀態(tài)轉(zhuǎn)移方程:

C[i]=max{C[i-1]+A[i],A[i]},i=2,3,...n

若A[1]>0?? C[1]=A[1]

否則????????? C[1]=0

故:OPT(A)=max{C[i]}

③偽碼:

算法:MaxSum(A,n)
輸入:數(shù)組A[n]
輸出:最大字段和sum和子段最后位置c

1.max <- 0
  if A[1]>0
  then C[1]:=A[1];
  else  C[1]:=0;
2.for i <- 2 to n do
3.  if C[i-1] > 0
    then C[i] := C[i-1]+A[i]
    else C[i] := A[i]
4.max = 0;
5.for i <- 1 to n do
    if max < C[i]
    then max := C[i]
6.輸出max和i

  
時(shí)間復(fù)雜度:O(n)   

3.矩陣連乘問(wèn)題

問(wèn)題:給定n個(gè)矩陣{A1,A2...An},其中Ai與Ai+1是可乘的,確定計(jì)算矩陣連乘計(jì)算順序,使得依此次序矩陣連乘積需要的數(shù)乘次數(shù)最少。輸入數(shù)據(jù)為矩陣的個(gè)數(shù)和每個(gè)矩陣的規(guī)模,輸出結(jié)果為計(jì)算矩陣連乘積的計(jì)算次序和最少數(shù)乘次數(shù)。

最優(yōu)性原理:

為方便起見(jiàn),將連乘積AiAi+1...Aj簡(jiǎn)記為A[i:j],其中Ai的維度記為pi-1×pi。

計(jì)算A[i:j]最優(yōu)次序所包含的計(jì)算矩陣子鏈A[i:k],A[k+1:j]的次序也是最優(yōu)的。即該問(wèn)題的最優(yōu)解包含子問(wèn)題的最優(yōu)解,滿(mǎn)足最優(yōu)性原理。

步驟一:劃分子問(wèn)題

問(wèn)題目的求解A[1:n]的最優(yōu)解,則可將問(wèn)題劃分為求若干個(gè)A[i:j]的最優(yōu)計(jì)算次序。

考察A[i:j]的最優(yōu)計(jì)算次序:設(shè)這個(gè)計(jì)算次序在矩陣Ak和Ak+1之間將矩陣鏈斷開(kāi),i<=k<j,則其相應(yīng)的括號(hào)方式為:(AiAi+1..Ak)(Ak+1...Aj)。則A[i:k]的計(jì)算量加上A[k+1,j]的計(jì)算量,再加上A[i:k]和A[k+1,j]相乘的計(jì)算量。

步驟二:建立狀態(tài)轉(zhuǎn)移方程

設(shè)計(jì)算A[i:j],1<=k<j,所需要的最少數(shù)乘次數(shù)為dp[i,j],原問(wèn)題的最優(yōu)值dp[1,n].

①當(dāng)i=j時(shí),dp[i,j]=0

②當(dāng)i<j時(shí),dp[i,j]=min{dp[i,k]+dp[k+1,j]+pi-1pkpj

步驟三:存儲(chǔ)狀態(tài)的值求解

在程序中,dp的實(shí)現(xiàn)是一個(gè)二維數(shù)組,也就是一張二維表,為了方便計(jì)算,dp的下標(biāo)從1開(kāi)始。要計(jì)算 A [ 1 : n ]的最少乘次,本質(zhì)上是求dp[1][n]的值,也就是二維表表右上角的值.
例如,連乘矩陣個(gè)數(shù)為6,維數(shù)分別為:
A 1 ( 30 × 35 ) ;
A 2 ( 35 × 15 ) ;
A 3 ( 15 × 5 ) ;
A 4 ( 5 × 10 ) ;
A 5 ( 10 × 20 ) ;
A 6 ( 20 × 25 ) ;
算法分析與設(shè)計(jì)---分治+動(dòng)態(tài)規(guī)劃

?根據(jù)遞歸公式,對(duì)角線的值為0。其他值需要根據(jù)于斷開(kāi)位置 k k k的值來(lái)得到, k ∈ [ i , j ) k \in [i,j) k∈[i,j),我們要遍歷所有 k k k,就要訪問(wèn)所求值的所有同一行左邊的值和同一列下方的值。因此,在代碼中我們可以使用自底向上、從左到右的計(jì)算順序來(lái)依次填充,最終得到右上角的值。如:

dp[2][5]=min{dp[2][2]+dp[3][5]+p1p2p5,dp[2][3]+dp[4][5]+p1p3p5,dp[2][4]+dp[5][5]+p1p4p5}

關(guān)鍵代碼:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-467462.html

for(i=1;i<=n;i++)
{
  for(j=i;j<=n;j++)
 {
   if(i==j) dp[i][j]=0;
   else
   {
     for(k=i;k<j;k++)
      {
        temp=dp[i][k]+dp[k+1][j]+p[i-1]*p[k]*p[j];
        if (temp < dp[i][j])
        {
            dp[i]j]=temp;
            S[i][j]=k;//記錄分割處
        }
      }
   }
 }
}    

到了這里,關(guān)于算法分析與設(shè)計(jì)---分治+動(dòng)態(tài)規(guī)劃的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 四大算法:貪心、分治、回溯、動(dòng)態(tài)規(guī)劃

    貪心算法(又稱(chēng)貪婪算法),在求解問(wèn)題時(shí),總是做出在當(dāng)前看來(lái)是最好的選擇。也就是說(shuō),不從整體最優(yōu)解進(jìn)行考慮,而是得到某種意義上的局部最優(yōu)解。 貪心算法采用自頂向下,以迭代的方法做出貪心選擇,每做一次貪心選擇,就將所求問(wèn)題簡(jiǎn)化為一個(gè)規(guī)模更小的問(wèn)題。

    2024年02月15日
    瀏覽(148)
  • 探索經(jīng)典算法:貪心、分治、動(dòng)態(tài)規(guī)劃等

    探索經(jīng)典算法:貪心、分治、動(dòng)態(tài)規(guī)劃等

    貪心算法是一種常見(jiàn)的算法范式,通常在解決最優(yōu)化問(wèn)題中使用。 貪心算法是一種在每一步選擇中都采取當(dāng)前狀態(tài)下最優(yōu)決策的算法范式。其核心思想是選擇每一步的最佳解決方案,以期望達(dá)到最終的全局最優(yōu)解。這種算法特點(diǎn)在于只考慮局部最優(yōu)解,而不會(huì)回溯或重新考慮

    2024年02月05日
    瀏覽(25)
  • 五大常用算法——分治法,動(dòng)態(tài)規(guī)劃,回溯法,分支界限法,貪心算法

    五大常用算法——分治法,動(dòng)態(tài)規(guī)劃,回溯法,分支界限法,貪心算法

    (1) 分治法 將一個(gè)難以直接解決的大問(wèn)題,分割成一些規(guī)模較小的相同問(wèn)題 快速排序 快排也是分治的一個(gè)實(shí)例,快排每一趟會(huì)選定一個(gè)數(shù),將比這個(gè)數(shù)小的放左面,比這個(gè)數(shù)大的放右面, 然后遞歸分治求解兩個(gè)子區(qū)間,當(dāng)然快排因?yàn)樵诜值臅r(shí)候就做了很多工作, 當(dāng)全部分到

    2024年02月04日
    瀏覽(27)
  • 【leetcode刷題之路】劍指Offer(4)——分治+排序算法+動(dòng)態(tài)規(guī)劃

    8 分治算法 8.1 【遞歸】劍指 Offer 07 - 重建二叉樹(shù) https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/ ??前序遍歷是根左右,中序遍歷是左根右,這也就意味著前序遍歷的第一個(gè)節(jié)點(diǎn)是整棵樹(shù)的根節(jié)點(diǎn),順著這個(gè)節(jié)點(diǎn)找到它在中序遍歷中的位置,即為in_root,那么in_root左邊的都在左子

    2024年02月11日
    瀏覽(23)
  • 算法分析與設(shè)計(jì)--動(dòng)態(tài)規(guī)劃

    算法分析與設(shè)計(jì)--動(dòng)態(tài)規(guī)劃

    一、動(dòng)態(tài)規(guī)劃簡(jiǎn)介 二、動(dòng)態(tài)規(guī)劃求解步驟 三、動(dòng)態(tài)規(guī)劃典型應(yīng)用 數(shù)字三角形問(wèn)題 最大子段和問(wèn)題 0-1背包問(wèn)題 四、最長(zhǎng)公共子序列問(wèn)題 動(dòng)態(tài)規(guī)劃求解 五、總結(jié) 算法語(yǔ)言--java語(yǔ)言 動(dòng)態(tài)規(guī)劃算法通常用于求解具有某種最優(yōu)性質(zhì)的問(wèn)題。動(dòng)態(tài)規(guī)劃與分治算法類(lèi)似,其基本思想也

    2024年02月07日
    瀏覽(21)
  • 算法設(shè)計(jì)與分析復(fù)習(xí)--動(dòng)態(tài)規(guī)劃

    算法設(shè)計(jì)與分析復(fù)習(xí)--動(dòng)態(tài)規(guī)劃

    算法設(shè)計(jì)與分析復(fù)習(xí)–遞歸與分治(二) 與分析法類(lèi)似:將原問(wèn)題分解為子問(wèn)題 不同點(diǎn):不是通過(guò)遞歸的方式,而是自底向上的求解問(wèn)題 矩陣連乘的次數(shù)是左矩陣行列,右矩陣行列取出左右中進(jìn)行相乘。 由于矩陣乘積需要滿(mǎn)足左矩陣列等于右矩陣的行,所以可以用一維數(shù)組

    2024年02月04日
    瀏覽(19)
  • 算法設(shè)計(jì)與分析—?jiǎng)討B(tài)規(guī)劃例題

    題目描述 求FIB數(shù)列第n項(xiàng)的值 輸入 輸入一個(gè)整數(shù)n,表示需要輸出FIB數(shù)列第n項(xiàng)的值 輸出 輸出FIB數(shù)列第n項(xiàng)的值 樣例輸入 ?復(fù)制 樣例輸出 ?復(fù)制 提示 題目描述 長(zhǎng)江游艇俱樂(lè)部在長(zhǎng)江上設(shè)置了n (n=10)個(gè)游艇出租站1,2,…,n。游客可在這些游艇出租站租用游艇,并在下游的

    2024年04月13日
    瀏覽(20)
  • 【算法分析與設(shè)計(jì)】動(dòng)態(tài)規(guī)劃(下)

    【算法分析與設(shè)計(jì)】動(dòng)態(tài)規(guī)劃(下)

    ??若給定序列X={x1,x2,…,xm},則另一序列Z={z1,z2,…,zk},是X的 子序列 是指 存在一個(gè)嚴(yán)格遞增下標(biāo)序列{i1,i2,…,ik}使得對(duì)于所有j=1,2,…,k有:zj=xij 。例如,序列Z={B,C,D,B}是序列X={A,B,C,B,D,A,B}的子序列,相應(yīng)的遞增下標(biāo)序列為{2,3,5,7}。 ??給定2個(gè)序列X和Y,當(dāng)另

    2024年02月08日
    瀏覽(20)
  • 算法設(shè)計(jì)與分析實(shí)驗(yàn)---動(dòng)態(tài)規(guī)劃

    算法設(shè)計(jì)與分析實(shí)驗(yàn)---動(dòng)態(tài)規(guī)劃

    任務(wù)描述 沿著河岸擺放 N 堆石子,現(xiàn)要將石子有次序地合并成一堆,規(guī)定每次只能選相鄰的 2 堆合并成新的一堆,并將新的一堆的石子數(shù),記為該次合并的得分。 例如: 4 堆石子 4,5,9,4 ,可以按 (((4,5),9),4) 合并。 第一次合并得分是 9 分,合并之后石子堆是 9,9,4 第二次合并得

    2024年02月08日
    瀏覽(21)
  • 【算法分析與設(shè)計(jì)】動(dòng)態(tài)規(guī)劃(上)

    【算法分析與設(shè)計(jì)】動(dòng)態(tài)規(guī)劃(上)

    ?? 理解動(dòng)態(tài)規(guī)劃算法的概念 。 ?? 掌握動(dòng)態(tài)規(guī)劃算法的基本要素 : ??(1) 最優(yōu)子結(jié)構(gòu)性質(zhì) ??(2) 重疊子問(wèn)題性質(zhì) ??掌握設(shè)計(jì)動(dòng) 態(tài)規(guī)劃算法的步驟 : ??(1) 找出最優(yōu)解的性質(zhì),并刻劃其結(jié)構(gòu)特征 。 ??(2) 遞歸地定義最優(yōu)值 。 ??(3) 以自底向上的方式計(jì)算

    2024年02月08日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包