三角形

题目描述


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
 
一开始想的是从上向下走,从最上边向下找最大的,后来发现这个思路不对。
 
到了晚上看了看书,读到了一个回溯法。最大路径是必然存在的,并且只有一条,所以倒着走,每个数字选择与自己较大的相加。
 
下面上代码:
#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\n",num[1][1]);
    }
    
    return 0;    
}

 

posted @ 2016-02-19 17:29  马小宝  阅读(540)  评论(0编辑  收藏  举报