原题传送门
思路:动态规划求最优解题,此题采用逆向解法比较容易。先定义一个变量和一个数组分别存放行数以及输入的各行的数,然后从数组的倒数第二行开始从下往上的每一行中的每个元素分别去选择一个最优解(从左下方和右下方中选择较大的一个),然后累加到当前元素中,以此类推,最后输出最顶端的元素即可
代码参考
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1001;
int r,a[MAXN][MAXN]; //r为行数,数组存储每行的数
int main()
{
cin>>r;
//给数组赋值
for(int i = 0;i < r;i++)
for(int j = 0;j <= i;j++)
cin>>a[i][j];
//从倒数第二行开始从下往上寻找每个最优解
for(int i = r-2;i >= 0;i--)
for(int j = 0;j <= i;j++)
a[i][j]+=max(a[i+1][j],a[i+1][j+1]); //将左下方和右下方中较大的一个加到当前元素
cout<<a[0][0]<<endl;
return 0;
}