这道题需要利用动态规划来求解,可以先利用matrix[][]存储三角形,然后dp[ i ][ j ]代表从( i , j )点出发到达底部路径之和的最大值,则dp[ 0 ][ 0 ]即为问题的解。对应的状态转换方程为:
dp[ i ][ j ] = max(dp[ i + 1 ][ j ], dp[ i + 1 ][ j + 1 ]) + matrix[ i ][ j ]
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 100 + 10;
int main(){
int n, matrix[N][N], dp[N][N];
while(scanf("%d", &n) != EOF){
memset(dp, 0, sizeof(dp));
for(int i = 0; i < n; i++){
for(int j = 0; j <= i; j++){
scanf("%d", &matrix[i][j]);
dp[i][j] = matrix[i][j];
}
}
for(int i = n - 1; i >= 0; i--){
for(int j = 0; j <= i; j++){
dp[i][j] += max(dp[i + 1][j], dp[i + 1][j + 1]);
}
}
printf("%d\n", dp[0][0]);
}
return 0;
}