藍橋杯—數字三角形(C語言解法)


題目描述


上圖給出了一個數字三角形。從三角形的頂部到底部有很多條不同的路徑。對於每條路徑,把路徑上面的數加起來可以得到一個和,你的任務就是找到最大的和。
路徑上的每一步只能從一個數走到下一層和它最近的左邊的那個數或者右 邊的那個數。此外,向左下走的次數與向右下走的次數相差不能超過 1。

輸入描述

輸入的第一行包含一個整數 N(1 ≤N ≤100),表示三角形的行數。
下面的N行給出數字三角形。數字三角形上的數都是 0 至 100 之間的整數。

輸出描述

輸出一個整數,表示答案。

輸入輸出示例

輸入

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

輸出

27

思路

  1. 注意題目要求“向左下走的次數與向右下走的次數相差不能超過1”,開始沒注意到,以為任意一條路走到底部都可以,但是代碼寫完后和示例的答案不相同,才注意到。
  2. 先忽略題目要求,求到達最后一層的最大路徑和,只需要將本層的值與上一層與之相近(左上和右上)的較大數值相加,則最后一層的值即變成了頂層到底層路徑和的較大值。
  3. 現在加入題目要求,左下有右下走的次數相差不能超過1,根據要求,我們發現當層數位奇數層時,只有中間的1個數值符合要求,偶數層時,中間的兩個數值均符合要求,只需找到兩個數中更大的一個即可。

代碼

#include<stdio.h>
int main(){
    int num[110][110]={0};
    int n,i,j;
    int max=0;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        for(j=0;j<=i;j++){
            scanf("%d",&num[i][j]);
        }
    }//讀入數據
    for(i=1;i<n;i++){//求累計和
        for(j=0;j<=i;j++){
            if(j==0){num[i][j]+=num[i-1][j];}//每層第一個數單獨考慮,只需加上一層第一個數即可
            else{//其余數要加上一層左邊與右邊兩數中較大的一個
                num[i][j]+=num[i-1][j]>num[i-1][j-1]?num[i-1][j]:num[i-1][j-1];
            }
        }
    }
    if(n%2==0)max=num[n-1][n/2]>num[n-1][n/2-1]?num[n-1][n/2]:num[n-1][n/2-1];//總層數為偶數的處理方法
    else max=num[n-1][n/2];//總層數為奇數的處理方法
    printf("%d",max);
    return 0;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM