將正整數排成等邊三角形,三角形的底邊有n個數。從三角形頂點出發通過一系列相鄰整數,使得達到底邊時的總和最小(或最大)。
當n=4時,例子如下:
總和最小為14,路徑為2 -> 5 -> 1 -> 6
以下思路和演算法實現參考自:數字三角形(動態規劃)–演算法學習
先把最後一行寫入新的n×n的二維陣列中。再看原陣列中第n-1行的第乙個數1,比較它在三角形中加上左下角的數得到的結果小還是加上右下角的數得到的結果小,即比較1+8小還是1+6小。顯然是1+6小,則將結果7寫入新陣列的同乙個位置中。
類似的,可獲得新陣列第n-1行的所有元素。
遍歷到原陣列的第n-2行,就比較原陣列中第n-2行的元素加上它在新陣列中相應位置的左下角和右下角的數值哪個更小,並寫入到相應的位置。如第n-2行的第乙個元素5,比較5+7小還是5+10小。顯然是5+7小,則將結果12寫入。
最後可得到乙個完整的新陣列,而新陣列的第乙個元素值即為最小總和。而再從新陣列的第乙個元素起往下推,找左下角和右下角中小的那乙個,即可在原陣列的相應位置獲得路徑上的元素。如:
新陣列中第乙個數為14,路徑的開始的數則為原陣列的2;
14的左下角12小於右下角14,則路徑中加入原陣列的5;
12的左下角7小於右下角10,則路徑中加入原陣列的1;
7的左下角8大於右下角6,則路徑中種加入原陣列的6。
;//存放等邊三角形,上述思路中的原陣列
int minsum[max]
[max]
;//存放路徑和,上述思路中的新陣列
int n;
//底邊的數字個數
intmain()
}//將原陣列的第n行寫入新陣列
for(
int j=
1;j<=n;j++
)//從下往上遍歷,構建新陣列
for(
int i=n-
1;i>=
1;i--)}
//新陣列的第乙個元素即為最小總和
cout<<
"總和最小為:"
<
[1]<
//從上往下遍歷,找到新陣列與原陣列中對應的元素,並輸出。k為上一行的路徑元素所在的列
cout<<
"路徑:"
p.s.**還有很多不足,朋友們有需要就自行修改,如果有問題也麻煩幫我指出來!
C 數字三角形問題
c 數字三角形問題 description 給定乙個由n行數字組成的數字三角形如下圖所示。試設計乙個演算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。對於給定的由n行數字組成的數字三角形,計算從三角形的頂至底的路徑經過的數字和的最大值。input 輸入資料的第1行是數字三角形的行...
數字三角形問題
數字三角形問題 標籤 動態規劃 雜談分類 演算法設計 34 5 11 9 8 15 21 13 4 這是乙個數字三角形。請編乙個程式計算從頂至底的某處的一條路徑,使該路徑所經過的數字的總和最大。每一步可沿左斜線向下或右斜線向下走 1 三角形行數 200 三角形中的數字為整數0,1,99 輸入格式 第...
數字三角形問題
給定乙個由n行數字組成的數字三角形,設計乙個演算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。0,0 1,0 1,1 2,0 2,1 2,2 3,0 3,1 3,2 3,3 思路 動態規劃 動態方程 sum i,j a i,j max sum i,j 表示從 i,j 出發時能得到...