题目描述
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(图一)
图一表示一个5行的数字三角形。假设给定一个n行数字三角形,计算出从三角形顶至底的一条路径,使该路径经过的数字总和最大。
每一步只能由当前位置向左下或右下。
输入
你的程序要能接受标准输入。第一行包含一个整数T,表示总的测试次数。
对于每一种情况:第一行包含一个整数N,其中1 < N < 100,表示三角形的行数。
接下来的N行输入表示三角形的每一行的元素Ai,j,其中0 < Ai,j < 100。
输出
输出每次测试的最大值并且占一行。
样例输入
1
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出
30
解题思路
题目给的这个三角形不规范,准确的应该是这样:
7 1,1
3 8 2,1 2.2 ===>位置示意图
8 1 0 3,1 3.2 3.3
2 7 4 4 4.1 4.2 4.3 4.4
4 5 2 6 5 5.1 5.2 5.3 5.4 5.1
2 7 4 4 4.1 4.2 4.3 4.4
4 5 2 6 5 5.1 5.2 5.3 5.4 5.1
一开始想的是从上向下走,从最上边向下找最大的,后来发现这个思路不对。
到了晚上看了看书,读到了一个回溯法。最大路径是必然存在的,并且只有一条,所以倒着走,每个数字选择与自己较大的相加。
下面上代码:
#include<stdio.h> #define max 100 int findMax(int n,int m){ return m>n ? m : n; } int main(){ int i,j,n,m,sum,mid; int num[max][max]; scanf("%d",&n); while(n--){ scanf("%d",&m); for(i=1;i<=m;i++) for(j=1;j<=i;j++) scanf("%d",&num[i][j]); for(i=m;i>1;i--){ for(j=1;j<=i;j++){ num[i-1][j] += findMax(num[i][j],num[i][j+1]); //找到(左下、右下)较大的那个 } } printf("%d ",num[1][1]); } return 0; }