蓝桥杯试题 算法训练 数字三角形

试题 算法训练 数字三角形

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  (图3.1-1)示出了一个数字三角形。 请编一个程序计算从顶至底的某处的一条路
  径,使该路径所经过的数字的总和最大。
  ●每一步可沿左斜线向下或右斜线向下走;
  ●1<三角形行数≤100;
  ●三角形中的数字为整数0,1,…99;

.
  (图3.1-1)
输入格式
  文件中首先读到的是三角形的行数。

接下来描述整个三角形
输出格式
  最大总和(整数)
样例输入
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30

思路:本题又是一道可以用动态规划来求解的题目,先从底层开始算起(为什么不从顶层算起呢,因为路径一多的话,就需要回溯,再寻找,找到最佳答案时肯定花费的时间比较长),倒数第二层可以选择倒数第一层,2选择4或5,那么2和5结合肯定比4大,所以2的位置变成了7;而第二个数字7可以选择与5或2结合,选择比2大的5变成12,第三个4可以和2或6,选择大一点6变成10,最后一个也选择6和5中比较大的6,所以倒数第二层就变为7、12、10、10,再用第三层和这一层用同样的方式计算,第三层会变为20、13、10,再计算第二层变为23、21,最第一层只会剩下一个数,也就是最大的那个数30,所以这个方法可以省去很多多余的计算,比找不到就换一个路径,直到找到最大的好很多。

代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int n,i,j,a[105][105],b[105];
	cin>>n;
	for(i=1;i<=n;i++){
		for(j=0;j<i;j++){
			cin>>a[i][j];
			if(i==n){
				b[j]=a[i][j];
			}
		}
	}
	for(i=n-1;i>=0;i--){
		for(j=0;j<i;j++){
			a[i][j]=max(a[i][j]+b[j],a[i][j]+b[j+1]);
		}
		for(j=0;j<i;j++){
			b[j]=a[i][j];
		}
	}
	cout<<b[0];
}
发布了51 篇原创文章 · 获赞 47 · 访问量 1929

猜你喜欢

转载自blog.csdn.net/weixin_45269353/article/details/104657412