給定一個由n行數字組成的數字三角形,設計一個算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。
輸入數據a[m][n]:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
最優解數組b[m][n]:
分析:
分析:
這是一道典型的動態規劃問題,求頂到底的一條路徑數字總和最大,按照動態規劃思想,從底往上,子問題的和大,那么父問題的和就大,所以在給數組打底子的時候,就要找大的
1、二位數組代表什么:b[i][j]代表從這個點一直走到最后的最大值
2、數組打底:b數組把n-1行填充起來
3、遞推式:根據題目可知,要從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 //行數
int main(){
int **a=new int*[n]; //接收輸入的數據
int **b=new int*[n]; //存放最優值,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++) //數組打底工作
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;
}
運行截圖