1. 程式人生 > >[藍橋杯]ALGO-124.演算法訓練_數字三角形

[藍橋杯]ALGO-124.演算法訓練_數字三角形

 

問題描述
  (圖3.)示出了一個數字三角形。 請編一個程式計算從頂至底的某處的一條路
  徑,使該路徑所經過的數字的總和最大。
  ●每一步可沿左斜線向下或右斜線向下走;
  ●1<三角形行數≤100;
  ●三角形中的數字為整數0,1,…997
           3  8
         8  1  0
       2  7  4  4
  4  5  2  6  5.
  (圖3.)
輸入格式
  檔案中首先讀到的是三角形的行數。

  接下來描述整個三角形
輸出格式
  最大總和(整數)
樣例輸入
5
7
3
8 8 1 0 2 7 4 4 4 5 2 6 5 樣例輸出 30
題目描述

 

程式碼如下:

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define LEN 100
 4 #define MAX(X,Y) (X)>(Y)?(X):(Y)
 5 
 6 int main(void)
 7 {    
 8     int n,i,j,res;
 9     int dp[LEN+1][LEN+1];
10     memset(dp,0,sizeof(dp));
11     scanf("
%d",&n); 12 13 for (i=0 ; i<n ; i++) 14 { 15 for (j=0 ; j<=i ; j ++) 16 { 17 scanf("%d",&dp[i][j]); 18 if (i>0) //每行的資料依次新增上方或左上方中的最大值 19 { 20 if (j==0) 21 dp[i][j] += dp[i-1][j]; 22 else
23 dp[i][j] += MAX(dp[i-1][j],dp[i-1][j-1]); 24 } 25 } 26 } 27 res = dp[n-1][0]; 28 for (i=1 ; i<n ; i++)//遍歷最後一行中的最大值 29 if (dp[n-1][i] > res) 30 res = dp[n-1][i]; 31 32 printf("%d",res); 33 return 0; 34 } 35
C解法

 

解題思路:

從第二行開始,每個資料分別新增上方及左上方中的最大值(即走左下角的路和右下角的路)

最後查詢最後一行中的最大值