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;	
}
	
	
	

  

posted @ 2024-09-13 08:39  我信你个鬼!  阅读(2)  评论(0编辑  收藏  举报