動態(tài)規(guī)劃數(shù)字三角形



給定一個由n行數(shù)字組成的數(shù)字三角形,設(shè)計一個算法,計算出從三角形的頂至底的一條路徑,使該路徑經(jīng)過的數(shù)字總和最大。
輸入數(shù)據(jù)a[m][n]:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
最優(yōu)解數(shù)組b[m][n]:

分析:

分析:
  這是一道典型的動態(tài)規(guī)劃問題,求頂?shù)降椎囊粭l路徑數(shù)字總和最大,按照動態(tài)規(guī)劃思想,從底往上,子問題的和大,那么父問題的和就大,所以在給數(shù)組打底子的時候,就要找大的
1、二位數(shù)組代表什么:b[i][j]代表從這個點一直走到最后的最大值
2、數(shù)組打底:b數(shù)組把n-1行填充起來
3、遞推式:根據(jù)題目可知,要從n-2行往0行遍歷,也就是從下往上。公式為:b[m][n]=max{ b[m+1][n]+a[m][n] , b[m+1][n+1]+a[m][n] }

#include<stdio.h>
#define n 5           //行數(shù) 

int main(){
    int **a=new int*[n];  //接收輸入的數(shù)據(jù) 
    int **b=new int*[n];  //存放最優(yōu)值,b[i][j]存放著a[i][j]到底端的最大路徑的和 
    for(int i=0;i<n;i++){
        a[i]=new int[n];
        b[i]=new int[n];
    } 
    for(int i=0;i<n;i++){          
        for(int j=0;j<=i;j++){
            scanf("%d",&a[i][j]);
        }
    }
    for(int i=0;i<n;i++)     //數(shù)組打底工作
        b[n-1][i]=a[n-1][i];
    for(int i=n-2;i>=0;i--){
        for(int j=0;j<=i;j++){
    b[i][j]=(b[i+1][j]+a[i][j])>(b[i+1][j+1]+a[i][j])?(b[i+1][j]+a[i][j]):(b[i+1][j+1]+a[i][j]);
        }
    }
    printf("%d\n",b[0][0]);
    return 0;
} 
運行截圖
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容