1.题目描述(蓝桥练习题)
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和(路径上的每一步只可沿左斜线向下或右斜线向下走)。
输入描述
输入的第一行包含一个整数 N (1≤N≤100),表示三角形的行数。
下面的 N 行给出数字三角形。数字三角形上的数都是 0 至 99 之间的整数。
输出描述
输出一个整数,表示答案。
输入输出样例
示例
输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出:
30
题目解析
先定义一个数组a[100][100],存储数字三角形;
求最大值,且只能沿左斜线向下或右斜线向下走,所以不能依次从上往下加最大值;所以换个思路,从下往上加,如图:
从最后一排开始,比较第一个元素和第二个元素,将最大的值加到上一排的第一个元素中,依次类推,直到加到第一排,输出数组中的a[1][1]即可。
代码如下
#include <stdio.h>
int main()
{
// 请在此输入您的代码
int a[100][100];
int n;
scanf("%d",&n);
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
scanf("%d",&a[i][j]);
}
} //输入数组
int max;
for(i=n;i>1;i--){
for(j=1;j<i;j++){
if(a[i][j]>=a[i][j+1]) max=a[i][j];
else max=a[i][j+1];
a[i-1][j]+=max;
}
} //依次加最大值
printf("%d",a[1][1]);
return 0;
}
2.题目描述(2020省赛)
上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。
路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右 边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。
输入描述
输入的第一行包含一个整数 N (1≤N≤100),表示三角形的行数。
下面的 N 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。
输出描述
输出一个整数,表示答案。
输入输出样例
示例
输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出:
27
题目分析:
同上,因为向左下走的次数与向右下走的次数相差不能超过 1,所以只能从最后一行最中间的一个或两个元素向上加,才能满足条件,所以将用不到的元素均设置为0,然后在向上加,最终结果依然存储在a[1][1]中。
代码如下 (蓝桥暂时没用通过,但DEV编译即输出均正确,修改方法:把第七行的a[100][100]改为a[101][101] ,因为方便自己理解,没有用第0行和第0列,如果输出100行数据的话,数组a就会溢出,所以蓝桥练习时没有100%通过,下面的代码是没有修改过的)
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
// 请在此输入您的代码
int a[100][100];
int n;
scanf("%d",&n);
int i,j;
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
scanf("%d",&a[i][j]);
}
} //输入数组
int max;
//设置0
int hang=(n-1)/2,hang2=0;
for(i=1;i<=hang;i++){ //i调整hang个数
for(j=1;j<=hang-i+1;j++){
hang2=n-i+1; //记录设置到第几行
a[hang2][j]=0;a[hang2][hang2-j+1]=0;
}
}
for(i=n;i>1;i--){
for(j=1;j<i;j++){
if(a[i][j]>=a[i][j+1]) max=a[i][j];
else max=a[i][j+1];
a[i-1][j]+=max;
}
} //依次加最大值
printf("%d",a[1][1]);
return 0;
}