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

動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法

這篇具有很好參考價值的文章主要介紹了動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

  • 三部曲如下三步:
  1. 基本原則:“空間換時間” 存儲重復子問題的解,減少運算時間
  2. 底層運算:“表格操作” 用表格存儲子問題的解
  3. 實現(xiàn)路線:“子問題劃分、自底向上求解” 利用表格中存儲的子問題的解,求上一層子問題的解。

一、矩陣連乘問題

1、問題描述

動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法
動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法

2、完全加括號

矩陣連乘計算次序 可以用 加括號的方式 來確定。特別的,完全加括號的矩陣連乘積可遞歸地定義為:

  • 單個矩陣是完全加括號的
  • 矩陣連乘積 A 是完全加括號的,則 A 可示為2個完全加括號的矩陣連乘積 B 和 C 的乘積并加括號,即 A=(BC)

動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法

3、問題分析

給定n個矩陣??1,?, ????,其中第i個矩陣的維度為??(???1)×????,以及它們的一個完全加括號方案:
動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法
動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法
動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法

4、最優(yōu)子結(jié)構性質(zhì)

構建原問題最優(yōu)解 與 子問題最優(yōu)解之間的關系:
動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法

5、狀態(tài)表示和遞推方程

動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法

6、自問題個數(shù)和求解順序

動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法

二、計算最優(yōu)值示例

1、問題描述

動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法

2、計算最優(yōu)值示例*****

動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法
動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法
動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法

按以下順序計算:

  1. 第一次計算(遍歷):
    m(1,2)=30 * 35 * 15 = 15750
    m(2,3)=35 * 15 * 5 = 2625
    m(3,4)=15 * 5 * 10 = 750
    m(4,5)=5 * 10 * 20 = 1000
    m(5,6)=10 * 20 * 25 = 5000
  2. 第二次計算(遍歷)
    • m(1,3) =7875時,有兩種情況,k = 1 或者 k =2 時,(下面的數(shù)據(jù)就可以使用上面算法的,這就是自底向上)
      k=1時,m(1,1)+m(2,3)+30 * 35 * 5= 7875
      k=2時,m(1,2)+m(3,3)+30 * 15 * 5= 23000
      最小的值為7875,
    • m(2,4)=4375時,有兩種情況,k = 2 或者k =3 時,(同上)
      k = 2時,m(2,2)+m(3,4)+35 * 15 * 10 = 6000
      k = 3時,m(2,3)+m(3,3)+35 * 5 * 10 = 4375
      最小的值為 4375
    • 后面同上計算,依次是:
    • m(3,5)=2500,k=3 或者 k=4
    • m(4,6)=3500,k=4 或者 k=5
  3. 第三次計算(遍歷)
    • m(1,4)=9375時,k 有三次情況,k=1,k=2,k=3,(同上)
      k=1時,m(1,1)+m(2,4)+30 * 35 * 10 = 14875
      k=2時,m(1,2)+m(3,4)+30 * 15 * 10 = 21000
      k=3時,m(1,3)+m(4,4)+30 * 5 * 10 = 9375
    • m(2,5)=7125時,k 有三次情況,k=2,k=3,k=4
      k = 2,m(2,2)+m(3,5)+35 * 15 * 20 = 13000
      k = 3,m(2,3)+m(4,5)+35 * 5 * 20 = 7125
      k = 4,m(2,4)+m(5,5)+35 * 10 * 20 = 11375
    • m(3,6)=5375
  4. 第四次計算(遍歷)
    • m(1,5)=11875時,k 有四次情況,k=1,k=2,k=3,k=4,(同上)
      k=1時,m(1,1)+m(2,5)+30 * 35 * 20 = 28125
      k=2時,m(1,2)+m(3,5)+30 * 15 * 20 = 27250
      k=3時,m(1,3)+m(4,5)+30 * 5 * 20 = 11875
      k=4時,m(1,4)+m(5,5)+30 * 10 * 20 = 15375
    • m(2,6)=10500
  5. 第五次計算(遍歷)
    • m(1,6)= 15125時,k 有五次情況,k=12345,(同上)
      k = 1時,m(1,1)+m(2,6)+30 * 35 * 25 = 36750
      k = 2時,m(1,2)+m(3,6)+30 * 15 * 25 = 34250
      k = 3時,m(1,3)+m(4,6)+30 * 5 * 25 = 15125
      k = 4時,m(1,4)+m(5,6)+30 * 10 * 25 = 21875
      k = 5時,m(1,5)+m(5,5)+30 * 20 * 25 = 26875
      動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法

3、構造最優(yōu)解

動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法
動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法
動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法

4、算法實現(xiàn)

import java.util.Scanner;

/**
 * DP 算法之 矩陣連乘
 */
public class Main {

    public  static long[][] memoTable;   // 存放局部最優(yōu)值
    public  static int[][]  bestK ;      // 存放 劃括號k 的位置
    public  static int[]    dim ;        // 存放矩陣的值
    public  static int      matrixNum;   // 二位矩陣 的維度


    /**
     * 自底向上地計算最優(yōu)值,結(jié)果保存在全局變量memoTable和bestK中
     * @param matrixNum
     * @return
     */
    static long MatrixChain(int matrixNum) {
        int i,j,len,k;
        for(i=1; i<=matrixNum; i++) //單個矩陣的情形,定義數(shù)乘次數(shù)為0
            memoTable[i][i] = 0;
        for(len=2; len<=matrixNum; len++){ //計算長度為len的矩陣鏈最優(yōu)值
            for(i=1; i<=matrixNum-len+1; i++) { //矩陣鏈的開始矩陣下標
                j = i+len-1;                    //矩陣鏈的結(jié)束矩陣下標
                memoTable[i][j] = 100000000;    //預定義的一個充分大數(shù)
                for(k=i; k<j; k++) {  //枚舉劃分位置
                    long ans = memoTable[i][k] + memoTable[k+1][j] +
                            dim[i-1]*dim[k]*dim[j];
                    if (ans < memoTable[i][j]){ //更新最優(yōu)信息
                        bestK[i][j] = k;
                        memoTable[i][j] = ans;
                    }
                }//end of for k
            }//end of for i
        }//end of for len
        return memoTable[1][matrixNum];
    }

    /**
     * 遞歸構造最優(yōu)解
     * @param i
     * @param j
     * @param bestK
     * @return
     */
    public static String traceback(int i,int j,int[][] bestK) {
        if(i==j) {
            return String.format("A%s", i);
        }
        if(i==j-1){
            return String.format("A%sA%s", i, j);
        }
        int position = bestK[i][j];
        StringBuilder sb = new StringBuilder();
        if(i!=position) {
            sb.append("(");
        }
        sb.append(traceback(i, position, bestK));
        if(i!=position) {
            sb.append(")");
        }
        if(position+1!=j) {
            sb.append("(");
        }
        sb.append(traceback(position+1, j, bestK));
        if(position+1!=j) {
            sb.append(")");
        }
        return sb.toString();
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("請輸入矩陣的個數(shù):");
        matrixNum = in.nextInt();
        System.out.println("請輸入矩陣的行數(shù)和列數(shù):");
        dim = new int[matrixNum+1];
        for(int i = 0;i <= matrixNum;i++) {
            dim[i] = in.nextInt();
        }
        memoTable = new long[matrixNum+1][matrixNum+1];
        bestK = new int[matrixNum+1][matrixNum+1];
        long min = MatrixChain(matrixNum);
        System.out.println("矩陣連乘的最小次數(shù)是:" + min);
        System.out.println(String.format("矩陣的連乘次序:%s", traceback(1, matrixNum, bestK)));
    }
}

三、基本要素-最優(yōu)子結(jié)構

  • 最優(yōu)子結(jié)構性質(zhì),通俗地講就是問題的最優(yōu)解包含其子問題的最優(yōu)解。也就是說,如果把問題的最優(yōu)解分解(比如劃分為兩個或者多個部分,或者刪除第一個或者最后一個分量),得到一個子解,那么這個子解是其相應子問題最優(yōu)解。
    動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法
  • 最優(yōu)子結(jié)構性質(zhì)隱含了問題最優(yōu)解和子問題最優(yōu)解之間的一種遞推關系。它是動態(tài)規(guī)劃的基礎,遞推方程是最優(yōu)子結(jié)構性質(zhì)的體現(xiàn)。
  • 在分析問題的最優(yōu)子結(jié)構性質(zhì)時,人們一般采用 反證法 :首先假設由問題最優(yōu)解S導出的子問題的解不是最優(yōu)的,然后再推導在這個假設下可構造出比S更好的解 S’,從而得到矛盾。

四、基本要素-重疊子問題

  • 遞歸算法求解問題時,每次產(chǎn)生的子問題并不總是新問題,有些子問題被反復計算多次。這種性質(zhì)稱為子問題的重疊性質(zhì)。
  • 動態(tài)規(guī)劃算法,對每一個子問題只解一次,而后將其解保存在一個表格中,當再次需要解此子問題時,只是簡單地用常數(shù)時間查看一下結(jié)果。
  • 通常不同的子問題個數(shù)隨問題的大小呈多項式增長。因此用動態(tài)規(guī)劃算法只需要多項式時間,從而獲得較高的解題效率。 【降低復雜度不是本章的目標了?。?/code>】

五、遞歸方法

long MatrixChain(int i, int j){
    if (i == j) {//單個矩陣的情形
             memoTable[i][j] = 0;
        return 0;
    }
    long ans, min = 100000000;//預定義的一個充分大數(shù)

    for (int k=i; k<j; k++) {

        ans = MatrixChain(i,k) + MatrixChain(k+1,j)
 + dim[i-1]*dim[k]*dim[j]; //遞歸計算
        if (ans < min) {
            min = ans;
        }
    }
   return min;   }

動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法

六、備忘錄方法

動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法文章來源地址http://www.zghlxwxcb.cn/news/detail-484017.html

//遞歸調(diào)用前用 memset(memoTable,-1,sizeof(memoTable))初始化備忘錄表為-1
long MatrixChainMemo(int i,int j){
    if (memoTable[i][j] != -1)
        return memoTable[i][j]; //備忘錄表中有答案,則跳出遞歸調(diào)用過程
    if (i == j) {//單個矩陣的情形
             memoTable[i][j] = 0;
        return 0;
    }
    long ans,max = 100000000;//預定義的一個充分大數(shù)
    for (int k=i; k<j; k++) {
        ans = MatrixChainMemo(i,k)+MatrixChainMemo(k+1,j)
+dim[i-1]*dim[k]*dim[j]; //遞歸計算
        if (ans < max) {
            bestK[i][j]=k;
            max = ans;
        }
    }
    memoTable[i][j] = max;  //用遞歸執(zhí)行結(jié)果更新備忘錄表
    return max;
}

七、動態(tài)規(guī)劃算法設計的步驟

  1. 分析最優(yōu)解的性質(zhì),并刻劃其最優(yōu)子結(jié)構特征;
  2. 確定狀態(tài)表示S(x~1~,x~2~,…)狀態(tài)遞推方程,遞歸地定義最優(yōu)值;
  3. 確定狀態(tài)轉(zhuǎn)移順序,以自底向上的方式計算出最優(yōu)值;(從最小問題計算起,保存最優(yōu)子結(jié)果,在計算更大的問題時就可以調(diào)用之)
  4. 根據(jù)計算最優(yōu)值時得到的信息,構造最優(yōu)解

到了這里,關于動態(tài)規(guī)劃算法學習一:DP的重要知識點、矩陣連乘算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關文章

  • python算法中的機器學習算法之無監(jiān)督學習知識點(詳解)

    目錄 學習目標: 學習內(nèi)容: Ⅰ. K均值聚類(K-Means Clustering) Ⅱ. 層次聚類(Hierarchical Clusteri

    2024年02月01日
    瀏覽(23)
  • NLP重要知識點:預訓練模型【核心且詳細】

    NLP重要知識點:預訓練模型【核心且詳細】

    本資料是NLP核心知識點的ppt?。?!【文章較長,建議收藏】 本節(jié)課我們學習預訓練模型。 我們在學習詞向量的時候,應該知道了多個產(chǎn)生詞向量的方法,包括基于矩陣(詞-詞共現(xiàn)矩陣)分解的方法、基于語言模型(word2vec)的方法、以及結(jié)合二者優(yōu)點的Glove模型等其他產(chǎn)生詞

    2024年04月09日
    瀏覽(24)
  • 藍橋杯重要知識點和賽題直通車

    藍橋杯重要知識點和賽題直通車

    ?藍橋杯軟件賽零基礎備賽20周 第 1周(2023-10-23): 藍橋杯軟件賽介紹+官方鏈接+零基礎能得獎嗎? 第 2周(2023-10-30): ??贾R點+藍橋杯怎么判題+備賽計劃 第 3周(2023-11-06): 填空題(分數(shù)少但越來越不好做) 第 4周(2023-11-13): (練習再多也不夠的)雜題1 第 5周(2023-11-20): 雜題2 第

    2024年01月24日
    瀏覽(23)
  • 論文筆記--網(wǎng)絡重要節(jié)點排序方法綜述(概念性知識點)

    任曉龍, 呂琳媛 度中心性:節(jié)點的直接鄰居數(shù)目 半局部中心性:節(jié)點四層鄰居的信息 k-shell分解:度中心性的擴展,根據(jù)節(jié)點在網(wǎng)絡中的位置來定義,越在核心的節(jié)點越重要 1.1度中心性(DC) 節(jié)點的度分為入度和出度;權重為與節(jié)點相連的邊的權重之和 優(yōu)缺點: 優(yōu)點:簡單

    2024年02月05日
    瀏覽(23)
  • quarkus依賴注入之十三:其他重要知識點大串講(終篇)

    quarkus依賴注入之十三:其他重要知識點大串講(終篇)

    這里分類和匯總了欣宸的全部原創(chuàng)(含配套源碼):https://github.com/zq2599/blog_demos 本篇是《quarkus依賴注入》系列的終篇,前面十二篇已覆蓋quarkus依賴注入的大部分核心內(nèi)容,但依然漏掉了一些知識點,今天就將剩下的內(nèi)容匯總,來個一鍋端,輕松愉快的結(jié)束這個系列 總的來說,

    2024年02月13日
    瀏覽(25)
  • Hadoop/HDFS/MapReduce/Spark/HBase重要知識點整理

    Hadoop/HDFS/MapReduce/Spark/HBase重要知識點整理

    本復習提綱主要參考北京大學計算機學院研究生課程《網(wǎng)絡大數(shù)據(jù)管理與應用》課程資料以及廈門大學計算機科學系研究生課程 《大數(shù)據(jù)技術基礎》相關材料整理而成,供廣大網(wǎng)友學習參考,如有版權問題請聯(lián)系作者刪除:guanmeige001@pku.edu.cn Hadoop簡介 Hadoop的功能和作用: 高

    2024年02月02日
    瀏覽(48)
  • 從Referer到XMLHttpRequest:探究Web安全中的重要知識點

    從Referer到XMLHttpRequest:探究Web安全中的重要知識點

    目錄 Referer 概念 Referrer-policy(可以一定程度上防御CSRF攻擊) 同源 iframe sandbox(沙箱): cookie的原理: 如何設置Referrer? 盜鏈 盜鏈的工作原理 三種情況下可以引用圖片: XMLHTTPRequest AJAX(Asynchronous JavaScript and XML) XMLHttpRequest的實例屬性 XMLHttpRequest.readyState XMLHttpRequest.onreadystat

    2024年02月08日
    瀏覽(57)
  • AcWing算法學習筆記:動態(tài)規(guī)劃(背包 + 線性dp + 區(qū)間dp + 計數(shù)dp + 狀態(tài)壓縮dp + 樹形dp + 記憶化搜索)

    AcWing算法學習筆記:動態(tài)規(guī)劃(背包 + 線性dp + 區(qū)間dp + 計數(shù)dp + 狀態(tài)壓縮dp + 樹形dp + 記憶化搜索)

    算法 復雜度 時間復雜度0(nm) 空間復雜度0(nv) 代碼 算法 通過滾動數(shù)組對01背包樸素版進行空間上的優(yōu)化 f[i] 與 f[i - 1]輪流交替 若體積從小到大進行遍歷,當更新f[i, j]時,f[i - 1, j - vi] 已經(jīng)在更新f[i, j - vi]時被更新了 因此體積需要從大到小進行遍歷,當更新f[i, j]時,f[i - 1,

    2024年02月21日
    瀏覽(21)
  • DP算法:動態(tài)規(guī)劃算法

    DP算法:動態(tài)規(guī)劃算法

    (1)確定初始狀態(tài) (2)確定轉(zhuǎn)移矩陣,得到每個階段的狀態(tài),由上一階段推到出來 (3)確定邊界條件。 藍橋杯——印章(python實現(xiàn)) 使用dp記錄狀態(tài),dp[i][j]表示買i張印章,湊齊j種印章的概率 i表示買的印章數(shù),j表示湊齊的印章種數(shù) 情況一:如果ij,不可能湊齊印章,概

    2024年02月07日
    瀏覽(21)
  • 動態(tài)規(guī)劃(DP)(算法筆記)

    動態(tài)規(guī)劃(DP)(算法筆記)

    本文內(nèi)容基于《算法筆記》和官方配套練題網(wǎng)站“晴問算法”,是我作為小白的學習記錄,如有錯誤還請體諒,可以留下您的寶貴意見,不勝感激。 動態(tài)規(guī)劃(Dynamic Programming,DP)是一種用來解決一類最優(yōu)化問題的算法思想。簡單來說,動態(tài)規(guī)劃將一個復雜的問題分解成若干個子

    2024年02月05日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領取紅包

二維碼2

領紅包