問題描述:
給定一個有n行數字組成的數字三角形,如下圖所示:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
設計一個算法,計算出從三角形的頂端至底的一條路徑,是該路徑經過的數字總和最大。
樣例最大值為:30 = 7 + 3 +8 +7 + 5;
代碼:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> using namespace std; int a[105][105],mp[105][105]; void init() { memset(a,0,sizeof(a)); memset(mp,0,sizeof(mp)); } int find(int n) { for(int i=n-1;i>=1;i--) { for(int j=1;j<=i;j++) { mp[i][j]+=max(mp[i+1][j],mp[i+1][j+1]); } } return mp[1][1]; } int main() { int n; while(1) { printf("請輸入路徑層數(輸入“0”結束,上限100):"); scanf("%d",&n); if(!n){printf("See You Again!\n");break;} else if(n>100){printf("數據超限!請重新輸入!\n");continue;} init(); for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) { scanf("%d",&a[i][j]); mp[i][j]=a[i][j]; } int ans=find(n); printf("%d\n",ans); } return 0; } /* 5 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 */