递归方式求最大数

第四题:三角统计

考虑一个三角形的一系列整数,第1行1个数值,第2行2个数值,第3行3个数值,以此类推。开发一个程序统计一下从顶端到底部所有可能路径中出现的所有数字的和的最大值,规则:路径中的下一个数值位于本行下面,更确切地说,要么位于正下方,要么位于正下方的右边紧邻的位置。数字排列及可能路径如下图所示:

约束:

    行数是严格的正数,但小于100。

    所有数值均为正整数且在0至99之间,包含边界。

输入:

    在第一行的整数n,代表测试实例的个数。  随后跟随n个测试实例。每个测试实例的起始行是一个代表行数的整数,随后跟随的是其内容。

输出:

    对于每一个测试实例写出满足题意的确定值,每个值占一行。

样例输入:

2

3

1

2 1

1 2 3

4

1

1 2

4 1 2

2 3 1 1

样例输出:

5

9

程序源码:

import java.util.Scanner;


public class Demo4 {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // 从标准输入读取参数
    Scanner scanner = new Scanner(System.in);
    // 首先读取用例数
    String input = scanner.nextLine();
    int count = Integer.parseInt(input.trim());
    for (int i = 0; i < count; i++) {
     input = scanner.nextLine();
     int numbers = Integer.parseInt(input.trim());
     int items[][]=new int[numbers][];
     for(int j=0;j<numbers;j++){
      items[j]=new int[j+1];
      String str[];
      input=scanner.nextLine();
      str=input.split(" ");
      for(int m=0;m<j+1;m++){
       items[j][m]=Integer.valueOf(str[m]).intValue();
      }
     }
     //构造当前路径的最大数
     for(int f=0;f<numbers;f++){
      for(int t=0;t<=f;t++){
       if(t==0){
       if(f==0){
        items[f][t]=items[f][t];
       }
       else {
        items[f][t]=items[f-1][t]+items[f][t];
       }
       }
       else if(t==f){
        if(f==0){
         items[f][t]=items[f][t];
        }
        else {
         items[f][t]=items[f-1][t-1]+items[f][t];
        }
       }
       else{
        if(items[f-1][t-1]>items[f-1][t]){
         items[f][t]=items[f][t]+items[f-1][t-1];
        }
        else{
         items[f][t]=items[f][t]+items[f-1][t];
        }
       }
      }
     }
     int max=items[numbers-1][0];
     for(int k=1;k<numbers;k++){
      if(items[numbers-1][k]>max){
       max=items[numbers-1][k];
      }
     }
     System.out.println(max);
    }
 }
 
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值