• 三角形


    题目描述


    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
    ",num[1][1]);
        }
        
        return 0;    
    }
  • 相关阅读:
    git 本地仓库操作
    git学习一——Pro-Git
    React Router
    webpack详述
    webpack入门
    折半查找法
    String的常见操作(面试题)
    Java集合(五)—HashMap源码
    Java常见操作符
    Java随机数
  • 原文地址:https://www.cnblogs.com/maxiaobao/p/5201714.html
Copyright © 2020-2023  润新知