C++ 信息学奥赛 1258
#include <bits/stdc++.h> using namespace std; int main() { // 数据行数,也就是列数 int r; cin >> r; // 根据输入的行数创建对应大小的数组 int x[r][r]; // 将数组所有数据初始化为0 memset(x, 0, sizeof(x)); // 读入数据 for(int i=0;i<r;i++) { // 根据数据结构,第0行1个数据,第1行2个数据,第2行3个数据... // 因此每行数据量和行号i的关系应该是:数据量=i+1 for(int j=0;j<i+1;j++) { cin >> x[i][j]; } } // 逆向递推,从倒数第二行开始,把下方一行同一条路上来的较大数累加上来 for(int i=r-2;i>=0;i--) { // 遍历当前行的每个数据,数据量同样=i+1 for(int j=0;j<i+1;j++) { // 当前元素 = 当前元素 + 下方一行中需要从本元素经过的所有元素中最大的元素 // 一轮循环完保证本行所有元素均已最大化加成,也即从下方上来的线路到本处已是值最大。 x[i][j] += x[i+1][j] > x[i+1][j+1] ? x[i+1][j] : x[i+1][j+1]; } } cout << x[0][0]; return 0; }