數塔問題 遞推演算法

2021-09-21 16:32:56 字數 1069 閱讀 1115

關於輸入:本題輸入乙個正整數n,然後輸入n行數字,其中第i行有i個數字。例如:

73 8

8 1 0

2 7 4 4

4 5 2 6 5

本題輸入的三角陣列形狀如下圖1,在處理資料時按圖2形狀來處理。在上面的輸入案例中,可以按圖3所示數塔來處理。

圖1                          圖2                     圖3

問題需求:從數塔頂層到底層的某處所經過的路徑可能有很多條。本題要求計算所有路徑中,各節點數之和最大的那條路徑的節點數之和。(注意:只要求輸出節點數總和最大的那條路的節點數之和,不是要尋找那條路徑。)

另外:從上往下走時,每一步可以沿著左斜線或右斜線走。

關於資料規模:整個數塔的行數n<=100.數塔中的數字a[i][j] ∈ [0,99].

演算法分析:

本題不需要尋找路徑,可以簡單地遞推即可得到解答.

試想,從上往下走時,每一步都面臨左和右的選擇。為了得到最大總和,在看不見更深層的資料時,都應該按照貪心策略,從左和右兩邊中選比較大的那一邊作為向下一層行走的路線。這是正向思路,比較好理解。但這樣一來,路徑太多,很難找到解答。我們可以考慮逆向遞推。既然每一步都選擇較大的那一邊,那麼我們可以假設a[i][j]表示從i,j出發到達底層的最大值。那麼就有遞推公式:a[i][j]=max.如此一來,a[1][1]就是我們要找的值。

**如下:

1 #include 2

intmain()314

}1516for(i=n-1;i>0;i--)//從倒數第2層開始逆推每一層每乙個元素到底層的最大值

1723

}24 printf("

%d\n

",a[1][1

]);//輸出從頂層到底層的最大值

25return0;

26 }

數的計數 遞推演算法

我們要求找出具有下列性質數的個數 包含輸入的自然數n 先輸入乙個自然數n n 1000 然後對此自然數依照例如以下方法進行處理 不作不論什麼處理 在它的左邊加上乙個自然數,但該自然數不能超過原數的一半 加上數後。繼續按此規則進行處理,直到不能再加自然數為止。輸入有多組資料。每組資料為自然數n。對於每...

遞推演算法 劃分平面問題

劃分平面問題 多k個交點,多k 1個部分 1.題目 n條直線劃分乙個平面,可以劃分為幾部分?分析 增加到n條直線時,最多增加了n 1個交點,則增加了n個部分,即f n f n 1 n。includeint main printf d n a n 或輸出a i 1 return 0 2.題目 n條折線...

遞推演算法二

b align center size medium 遞推演算法二 冪積數列 size align b size medium b 冪積數列 b m 輸入整數n,m求小於n的按從小到大的第m個元素 分析 list b 窮盡法 b 從2開始到n,如果n 2 0,n n 2一直迴圈的直到不能除盡 n 3...