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

【數(shù)據(jù)結構】動態(tài)規(guī)劃(Dynamic Programming)

這篇具有很好參考價值的文章主要介紹了【數(shù)據(jù)結構】動態(tài)規(guī)劃(Dynamic Programming)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一.動態(tài)規(guī)劃(DP)的定義:

求解決策過程(decision process)最優(yōu)化的數(shù)學方法。

將多階段決策過程轉化為一系列單階段問題,利用各階段之間的關系,逐個求解。

二.動態(tài)規(guī)劃的基本思想:

與分治法類似,將待求解問題分解成若干個子問題。

但是經(jīng)分解得到的子問題往往不是相互獨立的。

如果使用分治法求解問題,有些子問題被重復計算了多次。

而“如何減少子問題的重復計算”是動態(tài)規(guī)劃算法的關鍵思想。

問題:如何減少子問題的重復計算呢?

解決方案:保存已解決的子問題的答案,在需要的時候找出已經(jīng)求得的答案。

三.動態(tài)規(guī)劃的基本步驟

1.找出最優(yōu)解的性質,并刻劃其結構特征。即:尋找最優(yōu)解的子問題結構。

2.遞歸地定義最優(yōu)解。即:根據(jù)子問題的結構建立問題的遞歸解式,求解最優(yōu)值。

3.以自底向上的方式計算出最優(yōu)值。

4.根據(jù)計算最優(yōu)值時得到的信息,構造最優(yōu)解。

四.例題分析——多個矩陣連乘模塊設計

問題描述:

實現(xiàn)多個矩陣連乘功能

關鍵問題計算:

給定n個矩陣{},其中與【數(shù)據(jù)結構】動態(tài)規(guī)劃(Dynamic Programming),數(shù)據(jù)結構,動態(tài)規(guī)劃,算法是可乘的,考察這n個矩陣的連乘積

由于矩陣乘法滿足結合律,所以計算矩陣的連乘可以有許多不同的計算次序。這種計算次序可以用加括號的方式來確定。

若一個矩陣連乘積的計算次序完全確定,也就是說該矩陣已完全加括號,則可以依此次序反復調(diào)用3個矩陣相乘的標準算法計算出矩陣連乘積。

完全加括號的矩陣連乘積:

設有四個矩陣 A,B,C,D 維數(shù)分別為:

50*10;10*40;40*30;30*5

則總共有五種完全加括號的方式:

1)

(A((BC)D))

2)

(A(B(CD)))

3)

((AB)(CD))

4)

(((AB)C)D)

5)

((A(BC))D)

對于兩個矩陣A(p*q)*B(q*r)(標準乘法計算):

void matrixMultiply(int *a,int *b,int *c,int ra,int ca,int rb,int cb){
    if(ca!=rb){
        cout<<"矩陣不可乘!"<<endl;
    }
    else{
        int i,j,k,n,sum=0;
        for(i=0;i<ra;i++){
            for(j=0;j<cb;j++){
                for(k=0;k<ca;k++){
                    sum+=a[i*ca+k]*b[k*cb+j];
                }
                c[i*ra+j]=sum;
                sum=0;
            }
        }
        
    }
}

需要進行p*q*r次乘法計算!

矩陣連乘問題轉化為:

確定矩陣連乘的計算次序,使得按照該次序計算矩陣連乘需要的數(shù)乘次數(shù)最少。

1.窮舉法求解思路:

????????列舉出所有可能的計算次序,并計算出每一種次序相應需要的數(shù)乘次數(shù),從中找出一種數(shù)乘次數(shù)最少的計算次序。

算法復雜度分析:

對于n個矩陣的連乘積,設其不同的計算次序為P(n)

由于每種加括號方式都可以分解為兩個子矩陣的加括號的問題

【數(shù)據(jù)結構】動態(tài)規(guī)劃(Dynamic Programming),數(shù)據(jù)結構,動態(tài)規(guī)劃,算法

2.動態(tài)規(guī)劃求解:

最優(yōu)解結構分析:

將矩陣連乘積【數(shù)據(jù)結構】動態(tài)規(guī)劃(Dynamic Programming),數(shù)據(jù)結構,動態(tài)規(guī)劃,算法簡記為:A[i:j],這里i<=j。

設這個計算次序在和【數(shù)據(jù)結構】動態(tài)規(guī)劃(Dynamic Programming),數(shù)據(jù)結構,動態(tài)規(guī)劃,算法之間將矩陣斷開,i<=k<j,則其相應的完全加括號的方式為:

【數(shù)據(jù)結構】動態(tài)規(guī)劃(Dynamic Programming),數(shù)據(jù)結構,動態(tài)規(guī)劃,算法)(【數(shù)據(jù)結構】動態(tài)規(guī)劃(Dynamic Programming),數(shù)據(jù)結構,動態(tài)規(guī)劃,算法)

總計算量=A[i:k]的計算量加上A[k+1:j]的計算量,再加上A[i:k]和A[k+1:j]相乘的計算量。

特征:計算A[i:j]的最優(yōu)次序所包含的計算矩陣子鏈A[i:k]和A[k+1:j]的次序也是最優(yōu)的。

最優(yōu)子結構性質:最優(yōu)解包含其子問題的最優(yōu)解。

建立遞歸關系:(m[i,j]表示最小連乘次數(shù))

當i=j時,A[i:j]=,m[i,j]=0

當i<j時,m[i,j]={m[i,k]+m[k+1,j]+}

則有:

【數(shù)據(jù)結構】動態(tài)規(guī)劃(Dynamic Programming),數(shù)據(jù)結構,動態(tài)規(guī)劃,算法

(k的位置只有j-i種可能)?

注:由于矩陣乘法中的列數(shù)和【數(shù)據(jù)結構】動態(tài)規(guī)劃(Dynamic Programming),數(shù)據(jù)結構,動態(tài)規(guī)劃,算法的行數(shù)相等,則可以只用列數(shù)來化簡表達式,這里的均表示第i-1,k,j個矩陣的列數(shù)。n個矩陣的信息,只需要一個長度為n+1的數(shù)組來表示即可。

對于m[i][j]數(shù)組,只需要填入上三角中的元素即可(因為i<=j)。

五.代碼實現(xiàn)文章來源地址http://www.zghlxwxcb.cn/news/detail-772711.html

#include <iostream>
using namespace std;
int BestValue(int row[],int col[], int n);
int main(int argc, const char * argv[]) {
    int row[]={3,4,6};
    int col[]={4,6,11};
    cout<<BestValue(row, col, 3);
    return 0;
}
int BestValue(int row[],int col[], int n){
    if(n<=0){
        cout<<"error";
        return 0;
    }
    int m[40][40];
    int i,j,k,r,sum;
    for(i=0;i<n-1;i++){
        if(col[i]!=row[i+1]){
            cout<<"error"<<endl;
            return 0;
        }
    }
    for(i=0;i<n;i++){
        m[i][i]=0;
    }
    for(r=1;r<n;r++){
        for(j=r;j<n;j++){
            i=j-r;
            sum=m[i][i]+m[i+1][j]+row[i]*col[i]*col[j];
            for(k=i;k<j;k++){
                if(sum>m[i][k]+m[k+1][j]+row[i]*col[k]*col[j]){
                    sum=m[i][k]+m[k+1][j]+row[i]*col[k]*col[j];
                }
            }
            m[i][j]=sum;
        }
    }
    return m[0][n-1];
}

到了這里,關于【數(shù)據(jù)結構】動態(tài)規(guī)劃(Dynamic Programming)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領支付寶紅包贊助服務器費用

相關文章

  • LC狂刷66道Dynamic-Programming算法題。跟動態(tài)規(guī)劃說拜拜

    LC狂刷66道Dynamic-Programming算法題。跟動態(tài)規(guī)劃說拜拜

    一種是從 (i-1, j) 這個位置走一步到達 一種是從(i, j - 1) 這個位置走一步到達 因為是計算所有可能的步驟,所以是把所有可能走的路徑都加起來,所以關系式是 dp[i] [j] = dp[i-1] [j] + dp[i] [j-1]。 步驟三、找出初始值 顯然,當 dp[i] [j] 中,如果 i 或者 j 有一個為 0,那么還能使用關

    2024年04月10日
    瀏覽(22)
  • 動態(tài)規(guī)劃Dynamic Programming

    動態(tài)規(guī)劃Dynamic Programming

    ?上篇文章我們簡單入門了動態(tài)規(guī)劃(一般都是簡單的上樓梯,分析數(shù)據(jù)等問題)點我跳轉,今天給大家?guī)淼氖锹窂絾栴},相對于上一篇在一維中摸爬滾打,這次就要上升到二維解決問題,但都用的是動態(tài)規(guī)劃思想嘛,所以大差不差,且聽我慢慢道來。 還是用一樣的方法,

    2024年03月27日
    瀏覽(16)
  • 動態(tài)規(guī)劃(Dynamic Programming)詳解

    引言: 動態(tài)規(guī)劃(Dynamic Programming,簡稱DP)是計算機科學與數(shù)學領域中的一個經(jīng)典算法設計策略,用于解決具有重疊子問題和最優(yōu)子結構特性的復雜問題。它通過將問題分解為更小的子問題來避免重復計算,從而提高效率。本文旨在詳細介紹動態(tài)規(guī)劃的基本概念、原理、實現(xiàn)

    2024年04月13日
    瀏覽(19)
  • 淺析動態(tài)規(guī)劃(Dynamic Programming,DP)

    淺析動態(tài)規(guī)劃(Dynamic Programming,DP)

    動態(tài)規(guī)劃可以理解為遞歸,只不過遞歸是通過函數(shù)實現(xiàn),動態(tài)規(guī)劃通過循環(huán)實現(xiàn)! 動態(tài)規(guī)劃有多好用我就不過多介紹,寫這篇文章的時候我也不是熟練掌握,只是單純記錄一下我的學習經(jīng)歷并分享一些我的心得體會,僅此而已。 推薦看一下這個視頻,對你的理解應該會有所

    2024年04月27日
    瀏覽(18)
  • 數(shù)據(jù)結構與算法-動態(tài)規(guī)劃

    數(shù)據(jù)結構與算法-動態(tài)規(guī)劃

    (我猜是做的多了背的題多了就自然懂了) 迭代法一般沒有通用去重方式,因為已經(jīng)相當于遞歸去重后了 這兩個問題其實是一個問題,一般直接寫出的沒有去重的遞歸法,復雜度很高,此時需要使用備忘錄去重,而備忘錄去重時間復雜度和使用dp數(shù)組進行迭代求解時間復雜度相同

    2024年02月04日
    瀏覽(25)
  • Dynamic-Programming(動態(tài)規(guī)劃)最細解題思路+代碼詳解(1)

    Dynamic-Programming(動態(tài)規(guī)劃)最細解題思路+代碼詳解(1)

    案例二:二維數(shù)組的 DP 我做了幾十道 DP 的算法題,可以說,80% 的題,都是要用二維數(shù)組的,所以下面的題主要以二維數(shù)組為主,當然有人可能會說,要用一維還是二維,我怎么知道?這個問題不大,接著往下看。 問題描述 一個機器人位于一個 m x n 網(wǎng)格的左上角 (起始點在

    2024年04月26日
    瀏覽(19)
  • python算法與數(shù)據(jù)結構---動態(tài)規(guī)劃

    python算法與數(shù)據(jù)結構---動態(tài)規(guī)劃

    記不住過去的人,注定要重蹈覆轍。 對于一個模型為n的問題,將其分解為k個規(guī)模較小的子問題(階段),按順序求解子問題,前一子問題的解,為后一子問題提供有用的信息。在求解任一子問題時,通過決策求得局部最優(yōu)解,依次解決各子問題。最后通過簡單的判斷,得到

    2024年02月20日
    瀏覽(31)
  • 數(shù)據(jù)結構與算法之貪心&動態(tài)規(guī)劃

    數(shù)據(jù)結構與算法之貪心&動態(tài)規(guī)劃

    ? ? ? ? 一:思考 ????????1.某天早上公司領導找你解決一個問題,明天公司有N個同等級的會議需要使用同一個會議室,現(xiàn)在給你這個N個會議的開始和結束 時間,你怎么樣安排才能使會議室最大利用?即安排最多場次的會議?電影的話 那肯定是最多加票價最高的,入場

    2024年02月09日
    瀏覽(25)
  • Java數(shù)據(jù)結構與算法----動態(tài)規(guī)劃(背包篇)

    Java數(shù)據(jù)結構與算法----動態(tài)規(guī)劃(背包篇)

    1.1.算法思路 0/1背包是動態(tài)規(guī)劃、背包問題中最經(jīng)典的問題啦!它主要的問題是: 給定n種物品、這n種物品的重量分別是,價值分別是?,而你有一個容量為C的背包,請問如何求出所能拿的最大價值呢? 對于動態(tài)規(guī)劃,我們先需要找到一條推導公式,然后確定邊界: 我們設

    2024年02月07日
    瀏覽(30)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領取紅包

二維碼2

領紅包