赞
踩
原题链接:
https://www.acwing.com/problem/content/900/https://www.acwing.com/problem/content/900/题目大意:
给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。
例子:
输入格式
第一行包含整数 nn,表示数字三角形的层数。
接下来 nn 行,每行包含若干整数,其中第 ii 行表示数字三角形第 ii 层包含的整数。
输出格式
输出一个整数,表示最大的路径数字和。
数据范围
1≤n≤5001≤n≤500,
−10000≤三角形中的整数≤10000
输入样例:
- 5
- 7
- 3 8
- 8 1 0
- 2 7 4 4
- 4 5 2 6 5
输出样例:
30
此题应从下面向上看,此时不会出现边界问题
利用c++自带的max函数来判断向上时的待加数
- for(int i=n;i>=1;i--){
- for(int j=i;j>=1;j--){
- a[i][j]=max(a[i+1][j],a[i+1][j+1])+a[i][j];
- }
- }
理解之后就简单了
上代码
- #include<bits/stdc++.h>
- using namespace std;
-
-
- int a[510][510];
-
-
-
- int main(){
- int n;
- cin >> n;
- for(int i=1;i<=n;i++){
- for(int j=1;j<=i;j++){
- cin >> a[i][j];
- }
- }
-
- for(int i=n;i>=1;i--){
- for(int j=i;j>=1;j--){
- a[i][j]=max(a[i+1][j],a[i+1][j+1])+a[i][j];
- }
- }
- cout<< a[1][1] <<endl;
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。