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

動(dòng)態(tài)規(guī)劃問(wèn)題實(shí)驗(yàn):數(shù)塔問(wèn)題

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

前言

動(dòng)態(tài)規(guī)劃是一種解決復(fù)雜問(wèn)題的方法,它將一個(gè)問(wèn)題分解為若干個(gè)子問(wèn)題,然后從最簡(jiǎn)單的子問(wèn)題開始求解,逐步推導(dǎo)出更復(fù)雜的子問(wèn)題的解,最終得到原問(wèn)題的最優(yōu)解。動(dòng)態(tài)規(guī)劃的關(guān)鍵是找到子問(wèn)題之間的遞推關(guān)系,以及確定合適的邊界條件和初始值。

數(shù)塔問(wèn)題是一個(gè)經(jīng)典的動(dòng)態(tài)規(guī)劃問(wèn)題,它描述了一個(gè)由數(shù)字組成的三角形結(jié)構(gòu),要求從頂部開始向下走,每次只能走到相鄰的位置,最終到達(dá)底部,使得經(jīng)過(guò)的數(shù)字之和最大。數(shù)塔問(wèn)題可以用一個(gè)二維數(shù)組來(lái)表示,其中第i行有i個(gè)元素,表示第i層的數(shù)字。例如:

9
12 15
10 6 8
2 18 9 5
16 12 18 10 8

數(shù)塔問(wèn)題的一個(gè)可能的最優(yōu)路徑是:9 -> 15 -> 8 -> 9 -> 18,其和為59。

實(shí)驗(yàn)內(nèi)容

給出一個(gè)數(shù)塔,從該數(shù)塔的頂層出發(fā),在每一個(gè)節(jié)點(diǎn)可以選擇向左走或向右走,一直走到該數(shù)塔的最底層,找出一條路徑,使得路徑上的數(shù)值和最大,輸出最大數(shù)值及其路徑,輸出時(shí)要求有文字說(shuō)明。請(qǐng)任選一種語(yǔ)言編寫程序?qū)崿F(xiàn)上述算法,并分析其算法復(fù)雜度。

實(shí)驗(yàn)流程

根據(jù)實(shí)驗(yàn)內(nèi)容設(shè)計(jì)算法偽代碼進(jìn)行算法描述;
利用C++/C/Java等編程語(yǔ)言對(duì)算法偽代碼進(jìn)行工程化實(shí)現(xiàn);
輸入測(cè)試用例對(duì)算法進(jìn)行驗(yàn)證;
列出算法時(shí)間復(fù)雜度模型并與計(jì)算機(jī)運(yùn)行統(tǒng)計(jì)時(shí)間進(jìn)行對(duì)比分析。

實(shí)驗(yàn)過(guò)程

實(shí)驗(yàn)分析

這個(gè)問(wèn)題是一個(gè)典型的動(dòng)態(tài)規(guī)劃問(wèn)題,動(dòng)態(tài)規(guī)劃的基本思想是將待求解問(wèn)題分解成若干個(gè)子問(wèn)題,先求解子問(wèn)題,然后從這些子問(wèn)題的解得到原問(wèn)題的解。動(dòng)態(tài)規(guī)劃通常需要保存已解決的子問(wèn)題的答案,以避免重復(fù)計(jì)算,節(jié)省時(shí)間。

對(duì)于數(shù)塔問(wèn)題,我們可以從下往上逐層計(jì)算每個(gè)節(jié)點(diǎn)到底層的最大路徑和,并記錄下每個(gè)節(jié)點(diǎn)選擇的方向。最后從頂層開始根據(jù)方向輸出路徑即可。

例如,給定一個(gè)數(shù)塔如下:

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

我們可以用一個(gè)二維數(shù)組a來(lái)存儲(chǔ)數(shù)塔中的數(shù)字,用另一個(gè)二維數(shù)組f來(lái)存儲(chǔ)每個(gè)節(jié)點(diǎn)到底層的最大路徑和,用另一個(gè)二維數(shù)組p來(lái)存儲(chǔ)每個(gè)節(jié)點(diǎn)選擇的方向(0表示左,1表示右)。初始化時(shí),f的最后一行就是a的最后一行,p可以任意初始化。

然后我們從倒數(shù)第二行開始,逐層向上計(jì)算f和p。對(duì)于每個(gè)節(jié)點(diǎn)a[i][j],我們比較它下面兩個(gè)節(jié)點(diǎn)f[i+1][j]和f[i+1][j+1]的大小,選擇較大者作為它到底層的最大路徑和,并記錄下選擇的方向。具體地,有如下狀態(tài)轉(zhuǎn)移方程:

f[i][j] = max(f[i+1][j], f[i+1][j+1]) + a[i][j]
p[i][j] = f[i+1][j] > f[i+1][j+1] ? 0 : 1
復(fù)制
當(dāng)我們計(jì)算完所有的f和p后,f[0][0]就是數(shù)塔頂層到底層的最大路徑和。我們可以從頂層開始根據(jù)p輸出路徑。具體地,我們用兩個(gè)變量i和j表示當(dāng)前節(jié)點(diǎn)的位置,初始為0和0。然后我們輸出a[i][j],并根據(jù)p[i][j]更新i和j(如果p[i][j]為0,則i=i+1,j=j;如果p[i][j]為1,則i=i+1,j=j+1)。重復(fù)這個(gè)過(guò)程直到i等于數(shù)塔的高度。

例如,對(duì)于上面給定的數(shù)塔,計(jì)算完f和p后得到如下結(jié)果:

f:
30
23 21
20 13 10
7 12 10 10
4 5 2 6 5

p:
1
0 1
0 0 0
0 0 0 0


則最大路徑和為30,路徑為7->3->8->7->5。

偽代碼

// Define a constant for the maximum height of the tower
constant MAXN = 100

// Declare a two-dimensional array to store the numbers in the tower
array a[MAXN][MAXN]

// Declare a two-dimensional array to store the maximum path sum from each node to the bottom
array f[MAXN][MAXN]

// Declare a two-dimensional array to store the direction of each node (0 for left, 1 for right)
array p[MAXN][MAXN]

// Define the main program
function main()
  // Declare an integer variable to store the height of the tower
  integer n
  // Input the height from the user
  input n

  // Input the numbers in the tower from the user
  for i from 0 to n-1 // Loop through each row
    for j from 0 to i // Loop through each column
      input a[i][j]

  // Initialize f and p
  for j from 0 to n-1 // Loop through the last row
    f[n-1][j] = a[n-1][j] // The last row of f is the same as the last row of a
    p[n-1][j] = -1 // The last row of p has no direction to choose

  // Compute f and p from bottom to top
  for i from n-2 to 0 // Loop through each row except the last one in reverse order
    for j from 0 to i // Loop through each column
      if f[i+1][j] > f[i+1][j+1] // If the left child is larger than the right child
        f[i][j] = f[i+1][j] + a[i][j] // Choose the left child as the maximum path sum and add the current node value
        p[i][j] = 0 // Record the direction as left
      else // Otherwise
        f[i][j] = f[i+1][j+1] + a[i][j] // Choose the right child as the maximum path sum and add the current node value
        p[i][j] = 1 // Record the direction as right

  // Output the maximum path sum and its path
  print "最大路徑和為:" + f[0][0] // The maximum path sum is f[0][0]
  print "路徑為:"
  i = 0, j = 0 // The current node position (starting from the top)
  while i < n // Loop until reaching the bottom row
    print a[i][j] + " " // Output the current node value
    if p[i][j] == -1 // If there is no direction to choose, break the loop (reached the bottom row)
      break
    if p[i][j] == 0 // If the direction is left, update the position to the next row and same column
      i = i + 1
    else // If the direction is right, update the position to the next row and right column
      i = i + 1
      j = j + 1


代碼實(shí)現(xiàn)

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAXN 100 // 數(shù)塔最大高度

int a[MAXN][MAXN]; // 存儲(chǔ)數(shù)塔中的數(shù)字
int f[MAXN][MAXN]; // 存儲(chǔ)每個(gè)節(jié)點(diǎn)到底層的最大路徑和
int p[MAXN][MAXN]; // 存儲(chǔ)每個(gè)節(jié)點(diǎn)選擇的方向(0表示左,1表示右)

int main() {
    int n; // 數(shù)塔高度
    scanf("%d", &n); // 輸入高度

    // 輸入數(shù)塔中的數(shù)字
    for (int i = 0; i < n; i++) {
        for (int j = 0; j <= i; j++) {
            scanf("%d", &a[i][j]);
        }
    }

    // 初始化f和p
    for (int j = 0; j < n; j++) {
        f[n-1][j] = a[n-1][j]; // 最后一行就是a的最后一行
        p[n-1][j] = -1; // 最后一行沒(méi)有方向可選
    }

    // 自底向上計(jì)算f和p
    for (int i = n-2; i >= 0; i--) { // 倒數(shù)第二行開始往上
        for (int j = 0; j <= i; j++) { // 每行有i+1個(gè)節(jié)點(diǎn)
            if (f[i+1][j] > f[i+1][j+1]) { // 如果左邊大于右邊
                f[i][j] = f[i+1][j] + a[i][j]; // 則選擇左邊作為最大路徑和,并加上當(dāng)前節(jié)點(diǎn)值
                p[i][j] = 0; // 記錄方向?yàn)樽?/span>
            } else { // 否則選擇右邊作為最大路徑和,并加上當(dāng)前節(jié)點(diǎn)值
                f[i][j] = f[i+1][j+1] + a[i][j];
                p[i][j] = 1; // 記錄方向?yàn)橛?/span>
            }
        }
    }

    // 輸出最大路徑和及其路徑
    printf("最大路徑和為:%d\n", f[0][0]); // 最大路徑和就是f[0][0]
    printf("路徑為:");
    int i = 0, j = 0; // 當(dāng)前節(jié)點(diǎn)位置(從頂層開始)
    while (i < n) { // 直到到達(dá)底層結(jié)束循環(huán)
        printf("%d ", a[i][j]); // 輸出當(dāng)前節(jié)點(diǎn)值
        if (p[i][j] == -1) break; // 如果沒(méi)有方向可選,則結(jié)束循環(huán)(已經(jīng)到達(dá)底層)
        if (p[i][j] == 0) { // 如果方向?yàn)樽?,則更新位置為下一行同一列
            i++;
        } else { // 如果方向?yàn)橛?,則更新位置為下一行右一列
            i++;
            j++;
        }
    }
    printf("\n");

    return 0;
}

分析算法復(fù)雜度

時(shí)間復(fù)雜度:由于需要遍歷整個(gè)數(shù)塔兩次(一次輸入數(shù)字,一次計(jì)算f和p),所以時(shí)間復(fù)雜度為O(n^2),其中n為數(shù)塔高度。
空間復(fù)雜度:由于需要使用三個(gè)二維數(shù)組來(lái)存儲(chǔ)數(shù)字、最大路徑和、方向信息,所以空間復(fù)雜度也為O(n^2),其中n為數(shù)塔高度。

用例測(cè)試

動(dòng)態(tài)規(guī)劃問(wèn)題實(shí)驗(yàn):數(shù)塔問(wèn)題

總結(jié)

本實(shí)驗(yàn)的目的是掌握動(dòng)態(tài)規(guī)劃的基本思想和方法,以及如何應(yīng)用動(dòng)態(tài)規(guī)劃解決數(shù)塔問(wèn)題。數(shù)塔問(wèn)題是一個(gè)經(jīng)典的動(dòng)態(tài)規(guī)劃問(wèn)題,給定一個(gè)由n層數(shù)字組成的三角形,從頂層出發(fā),在每一層可以選擇左邊或右邊的數(shù)字,一直走到底層,求出所經(jīng)過(guò)的數(shù)字之和的最大值。本實(shí)驗(yàn)采用自底向上的方法,從底層開始,計(jì)算每個(gè)位置到底層的最大值,并存儲(chǔ)在一個(gè)二維數(shù)組中,最后得到頂層到底層的最大值。本實(shí)驗(yàn)還要求輸出最大值對(duì)應(yīng)的路徑,即所選擇的數(shù)字序列。為了實(shí)現(xiàn)這一功能,需要在計(jì)算過(guò)程中記錄每個(gè)位置選擇的方向,并在計(jì)算完成后從頂層開始回溯,輸出所選擇的數(shù)字。

本實(shí)驗(yàn)的難點(diǎn)在于理解動(dòng)態(tài)規(guī)劃的原理和過(guò)程,以及編寫正確和高效的代碼。動(dòng)態(tài)規(guī)劃是一種將復(fù)雜問(wèn)題分解為子問(wèn)題,并利用子問(wèn)題之間的關(guān)系和重復(fù)性,避免重復(fù)計(jì)算,從而提高效率的方法。動(dòng)態(tài)規(guī)劃適用于具有最優(yōu)子結(jié)構(gòu)和重疊子問(wèn)題的問(wèn)題。最優(yōu)子結(jié)構(gòu)指的是原問(wèn)題的最優(yōu)解可以由子問(wèn)題的最優(yōu)解構(gòu)成,重疊子問(wèn)題指的是在求解過(guò)程中會(huì)多次遇到相同的子問(wèn)題。數(shù)塔問(wèn)題滿足這兩個(gè)條件,因?yàn)槊總€(gè)位置到底層的最大值只取決于它下面一層相鄰兩個(gè)位置的最大值,而且在計(jì)算過(guò)程中會(huì)多次計(jì)算同一個(gè)位置到底層的最大值。因此,可以用動(dòng)態(tài)規(guī)劃來(lái)解決數(shù)塔問(wèn)題。

本實(shí)驗(yàn)還需要注意代碼的編寫規(guī)范和風(fēng)格,以及程序的可讀性和可維護(hù)性。代碼應(yīng)該遵循統(tǒng)一和清晰的命名規(guī)則,使用適當(dāng)?shù)淖⑨尯涂s進(jìn),避免冗余和無(wú)用的代碼,使用合理的數(shù)據(jù)結(jié)構(gòu)和算法,處理好邊界情況和異常情況等。程序應(yīng)該具有良好的模塊化和封裝性,將不同功能分離為不同函數(shù)或類,并提供清晰和完整的接口和文檔。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-496531.html

到了這里,關(guān)于動(dòng)態(tài)規(guī)劃問(wèn)題實(shí)驗(yàn):數(shù)塔問(wèn)題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(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)文章

  • 【Python算法】實(shí)驗(yàn)12-動(dòng)態(tài)規(guī)劃與背包問(wèn)題

    目錄 實(shí)驗(yàn)內(nèi)容 1.數(shù)塔dp -A 2.骨牌鋪方格 3.一只小蜜蜂

    2024年02月15日
    瀏覽(19)
  • 【Python算法】實(shí)驗(yàn)8-動(dòng)態(tài)規(guī)劃與背包問(wèn)題

    目錄 實(shí)驗(yàn)內(nèi)容 1.數(shù)塔dp -A 2.骨牌鋪方格 3.一只小蜜蜂

    2023年04月19日
    瀏覽(32)
  • 算法設(shè)計(jì)與分析實(shí)驗(yàn)二:動(dòng)態(tài)規(guī)劃法求解TSP問(wèn)題和01背包問(wèn)題

    算法設(shè)計(jì)與分析實(shí)驗(yàn)二:動(dòng)態(tài)規(guī)劃法求解TSP問(wèn)題和01背包問(wèn)題

    【實(shí)驗(yàn)內(nèi)容】 (1)tsp問(wèn)題:利用動(dòng)態(tài)規(guī)劃算法編程求解TSP問(wèn)題,并進(jìn)行時(shí)間復(fù)雜性分析。 輸入:n個(gè)城市,權(quán)值,任選一個(gè)城市出發(fā); 輸出:以表格形式輸出結(jié)果,并給出向量解和最短路徑長(zhǎng)度。 (2)01背包問(wèn)題:利用動(dòng)態(tài)規(guī)劃算法編程求解0-1背包問(wèn)題,并進(jìn)行時(shí)間復(fù)雜性分

    2024年02月03日
    瀏覽(20)
  • 算法設(shè)計(jì)與分析實(shí)驗(yàn)4 :利用動(dòng)態(tài)規(guī)劃的方法解決子集等和分割判斷問(wèn)題

    實(shí)驗(yàn)4 ?利用動(dòng)態(tài)規(guī)劃的方法解決子集等和分割判斷問(wèn)題 一、實(shí)驗(yàn)?zāi)康?1. 了解動(dòng)態(tài)規(guī)劃的主要思想。 2. 掌握背包問(wèn)題解決方法用以解決該問(wèn)題。 3. 分析核心代碼的時(shí)間復(fù)雜度和空間復(fù)雜度。 二、實(shí)驗(yàn)內(nèi)容和要求 題目:給定一個(gè)只包含正整數(shù)的非空數(shù)組。是否可以將這個(gè)數(shù)組

    2024年04月23日
    瀏覽(29)
  • 頭歌 算法 實(shí)驗(yàn)七 動(dòng)態(tài)規(guī)劃

    頭歌 算法 實(shí)驗(yàn)七 動(dòng)態(tài)規(guī)劃

    第1關(guān):數(shù)塔問(wèn)題 300 任務(wù)要求 參考答案 評(píng)論9 任務(wù)描述 相關(guān)知識(shí) 編程要求 解題思路: 測(cè)試說(shuō)明 任務(wù)描述 本關(guān)任務(wù):編寫用動(dòng)態(tài)規(guī)劃解決數(shù)塔問(wèn)題。 相關(guān)知識(shí) 為了完成本關(guān)任務(wù),你需要掌握:動(dòng)態(tài)規(guī)劃。 編程要求 求上圖從頂層到頂層的一個(gè)路徑,使路徑上的數(shù)字和最大

    2024年04月14日
    瀏覽(17)
  • 實(shí)驗(yàn)七 動(dòng)態(tài)規(guī)劃

    實(shí)驗(yàn)七 動(dòng)態(tài)規(guī)劃

    第1關(guān):數(shù)塔問(wèn)題 300 任務(wù)要求 參考答案 評(píng)論9 任務(wù)描述 相關(guān)知識(shí) 編程要求 解題思路: 測(cè)試說(shuō)明 任務(wù)描述 本關(guān)任務(wù):編寫用動(dòng)態(tài)規(guī)劃解決數(shù)塔問(wèn)題。 相關(guān)知識(shí) 為了完成本關(guān)任務(wù),你需要掌握:動(dòng)態(tài)規(guī)劃。 編程要求 求上圖從頂層到頂層的一個(gè)路徑,使路徑上的數(shù)字和最大

    2024年01月25日
    瀏覽(16)
  • 頭歌實(shí)驗(yàn)七 動(dòng)態(tài)規(guī)劃

    頭歌實(shí)驗(yàn)七 動(dòng)態(tài)規(guī)劃

    本關(guān)任務(wù):編寫用動(dòng)態(tài)規(guī)劃解決數(shù)塔問(wèn)題。 相關(guān)知識(shí) 為了完成本關(guān)任務(wù),你需要掌握:動(dòng)態(tài)規(guī)劃。 編程要求 求上圖從頂層到頂層的一個(gè)路徑,使路徑上的數(shù)字和最大。要求輸出最大的數(shù)字和max和數(shù)值和最大的路徑。 ? 本關(guān)任務(wù):編寫用動(dòng)態(tài)規(guī)劃解決最長(zhǎng)公共子序列問(wèn)題。

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

    1.打家劫舍:? 給定一個(gè)代表每個(gè)房屋存放金額的非負(fù)整數(shù)數(shù)組,計(jì)算你 不觸動(dòng)警報(bào)裝置的情況下 ,一夜之內(nèi)能夠偷竊到的最高金額。 入: 每組測(cè)試案例有兩行,第一行只有一個(gè)整數(shù)N,代表著有N間房屋 第二行有N個(gè)整數(shù),代表著每間房屋里的金額,金額范圍[0, 1000]。 出:

    2024年01月24日
    瀏覽(27)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包