給定一個由n行數字組成的數字三角形,設計一個算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。
測試用例:
5(行數)
7
3 8
8 1 0
2 7 44
4 5 26 5
輸出:
30
解:
數字三角形問題:
如果得到一條由頂至底的某處的一條最佳路徑,那麼對於該路徑上的每一箇中間點來說,
由頂至該中間點的路徑所經過的數字和也爲最大,但是由頂到底有太多種情況需要考慮,
所以採用動態規劃由底到頂的策略,將每條小分支取大值代替a[i][j],最終輸出a[0][0]。
過程如圖(只寫出了處理過程,不變的位置並沒有給出)。
#include <stdio.h>
int main()
{
int n;
int i,j;
int a[100][100];
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=n-2;i>=0;i--)
{
for(j=0;j<=i;j++)
{
int temp1=a[i][j]+a[i+1][j];
int temp2=a[i][j]+a[i+1][j+1];
a[i][j]=temp1>temp2?temp1:temp2;
}
}
printf("%d\n",a[0][0]);
}