總時間限制: 1000ms 內存限制: 65536kB
描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(圖1)
圖1給出了一個數字三角形。從三角形的頂部到底部有不少條不一樣的路徑。對於每條路徑,把路徑上面的數加起來能夠獲得一個和,你的任務就是找到最大的和。
注意:路徑上的每一步只能從一個數走到下一層上和它最近的左邊的那個數或者右邊的那個數。
輸入
輸入的是一行是一個整數N (1 < N <= 100),給出三角形的行數。下面的N行給出數字三角形。數字三角形上的數的範圍都在0和100之間。
輸出
輸出最大的和。
樣例輸入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
樣例輸出
30ios
解析:web
動態規劃入門題。設數組bf[i][j]表示從第1行走到第n行第j列所獲得的最大和。那麼 bf[i][j] += max(bf[i+1][j],bf[i+1][j+1]); 數組
bf[0][0]即爲最後所求的最大和。代碼以下:spa
#include <iostream> #include <math.h> using namespace std; int main() { int bf[105][105]; int i,j; int n; cin>>n; for(i=0;i<n;i++) for(j=0;j<=i;j++) cin>>bf[i][j]; for(i=n-2;i>=0;i--) for(j=0;j<=i;j++) bf[i][j] += max(bf[i+1][j],bf[i+1][j+1]); cout<<bf[0][0]<<endl; return 0; }