數字三角形演算法

來源:互聯網
上載者:User

題目描述
顯示出了一個數字三角形。 請編一個程式計算從頂至底的某處的一條路


徑,使該路徑所經過的數位總和最大。 每一步可沿斜線符號向下或右斜

線向下走;1<三角形行數<25;三角形中的數字為整數<1000;

輸入

第一行為N,表示有N行後面N行表示三角形每條路的路徑權.

輸出

路經所過的數字總和的最大的答案。

範例輸入5
73 88 1 02 7 4 44 5 2 6 5範例輸出30

易錯點:首先要讀懂題意,題目要的是從左向下或者是從右向下;實際圖形是這樣的

73 88 1 02 7 4 44 5 2 6 5多以第二行的8是不能和第三行的8相加的。這一點很重要

本題思路是,先用一個二維數組把三角形的數字讀進去,然後再開一個二位元組來存放 從上到下經過該點的最大值,每個點都只有兩種情況,一是從它的正上方傳下來的,還有就是從它的正上方的前一個傳過來的。所以只要比較這兩個的大小,然後 把較大的數的值給當前位置的數組的值。當然第一行和最後一行除外。第一行和最後一行單獨賦值就可以。,比如第三行,到1的時候,可能加上左邊的3後再加1較大,也可能加上上方的8之後再加上1較大,在這兒只需要比較一下,然後賦值就可以啦。

具體情況見代碼。

#include<iostream>

using namespace std;
int main()
{
    int a[100][100],b[100][100];
    int i,j,N;
    cin>>N;
    for(i=0;i<N;i++)
        for(j=0;j<=i;j++)         //接收數字三角形的數字
            cin>>a[i][j];
    b[0][0]=a[0][0];
    for(i=1;i<N;i++)
    {
        for(j=0;j<=i;j++)
        {
            if(j==0)
                b[i][j]=b[i-1][j]+a[i][j];      //j為0時,即為第一行的相加
            else if(i==j)
                b[i][j]=b[i-1][j-1]+a[i][j];   //i=j時,即為最後一斜行相加;
            else
            {
            int x=b[i-1][j-1]+a[i][j];
            int y=b[i-1][j]+a[i][j];
            b[i][j]=x>y?x:y;
            }
        }
    }
    int max=b[N-1][0];
    for(i=0;i<N;i++)
        if(max<b[N-1][i])
            max=b[N-1][i];
    cout<<max<<endl;
}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.