C - 數字三角形問題
阿新 • • 發佈:2020-10-20
Description
給定一個由n行數字組成的數字三角形如下圖所示。試設計一個演算法,計算出從三角形的頂至底的一條路徑,使該路徑經過的數字總和最大。
對於給定的由n行數字組成的數字三角形,計算從三角形的頂至底的路徑經過的數字和的最大值。
Input
輸入資料的第1行是數字三角形的行數n,1≤n≤100。接下來n行是數字三角形各行中的數字。所有數字在0..99之間。
Output
輸出資料只有一個整數,表示計算出的最大值。
Sample
Input
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
Output
30
題解:可以從底層開始向上累加,從第n-1層開始,到達當前位置(i,j)下一層的座標為(i+1,j)或(i+1,j+1),故方程為 dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + dp[i][j];
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; int main() { /** * dp儲存輸入的數字三角形,後面是儲存累加到當前座標路徑的最大值。 */ int dp[105][105]; int n,i,j; scanf("%d",&n); for(i=0;i<n;i++) for(j=0;j<=i;j++) scanf("%d",&dp[i][j]); /** *從底層開始向上累加,選取最大值。 */ for(i=n-2;i>=0;i--){ for(j=0;j<=i;j++){ dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) + dp[i][j]; } } printf("%d\n",dp[0][0]); return 0; }