其实跟保龄球那个题是一模一样的
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define MAX_N 100
int triangle[MAX_N+10][MAX_N+10], dp[MAX_N+10][MAX_N+10];
int main()
{
int N = 0;
scanf("%d", &N);
for(int i = 1;i <= N;i++)
{
for(int j = 1;j <= i;j++)
scanf("%d", &triangle[i][j]);
}
//dp[i][j] 以第i行第j个数字为终点时路径和的最大值
dp[1][1] = triangle[1][1];
for(int i = 2;i <= N;i++)
{
for(int j = 1;j <= i;j++)
{
for(int k = j-1;k <= j;k++)
dp[i][j] = max(dp[i][j], dp[i-1][k]+triangle[i][j]);
}
}
int ans = -1;
for(int i = 1;i <= N;i++)
ans = max(ans, dp[N][i]);
cout << ans << endl;
return 0;
}