//题意:给一个数字n,代表着从i=1~n行,每行i个数字,然后求出从第一行到最后一行数字和最大的值,每个数字只能加他下一行的左边或者右边相邻的数字
//思路:动态规划从下向上推则会有最优解 动态规划dp[i][j] = dp[i][j] + max(dp[i+1][j], dp[i+1][j+1]);因为存图的时候是直角三角形存图 不然应该是dp[i][j] = dp[i][j] + max(dp[i+1][j-1], dp[i+1][j+1]);
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;
int dp[400][400];
int main()
{
int n;
while(scanf("%d", &n) != EOF){
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++){
for(int j = 1; j <= i; j++){
scanf("%d", &dp[i][j]);
}
}
for(int i = n-1; i >= 1; i--){
for(int j = 1; j <= i; j++){
dp[i][j] = dp[i][j] + max(dp[i+1][j], dp[i+1][j+1]); //就这里状态转移方程
}
}
cout << dp[1][1] << endl;
}
return 0;
}