acm_18The Triangle

来源:互联网 发布:少年维特之烦恼知乎 编辑:程序博客网 时间:2024/06/04 01:23

The Triangle

时间限制:1000 ms  内存限制:65535KB
难度:4
描述

7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
(Figure 1)
Figure 1 shows a number triangle. Write a program that calculatesthe highest sum of numbers passed on a route that starts at the topand ends somewhere on the base. Each step can go either diagonallydown to the left or diagonally down to the right.

输入
Your program is to read from standard input. The first linecontains one integer N: the number of rows in the triangle. Thefollowing N lines describe the data of the triangle. The number ofrows in the triangle is > 1 but <= 100. The numbers in thetriangle, all integers, are between 0 and 99.
输出
Your program is to write to standard output. The highest sum iswritten as an integer.
样例输入
573 88 1 0 2 7 4 44 5 2 6 5
样例输出
30
上传者
苗栋栋

import java.util.Scanner;

public class Triangle{

    publicstatic void main(String[] args) {
         Triangle triangle = new Triangle();
         triangle.solution();
    }
    int[]numlist;
    int[]resultList;
    introws;
    public voidsolution() {
      getData();
      System.out.println(handle());
    }
   
   //获取输入;
    private voidgetData(){
       Scanner in =new Scanner(System.in);
       rows = in.nextInt();
       //计算三角形中一共有多少个元素
       int temp = (1+rows)*rows/2;
       numlist = new int[temp];
       resultList = new int[temp];
       
       for(int i = 0 ; i < numlist.length; i++){
           numlist[i] =in.nextInt();
       }
    }
   
    //处理数据
    private inthandle(){
       for(int i =1; i <=rows ;i++){
          for(int j =1; j<=i ; j++){
             if(i ==1){
               setResultList(1, 1, acessTriangle(1, 1, false));
               continue;
             }
            
             if(j ==1){
               setResultList(i, j, acessTriangle(i-1, j, true)+acessTriangle(i, j,false));
               continue;
             }
            
             if(j >i-1){
               setResultList(i, j, acessTriangle(i-1, j-1, true)+acessTriangle(i,j, false));
             }else{
                int temp =Math.max(acessTriangle(i-1, j-1, true), acessTriangle(i-1, j,true));
               setResultList(i, j, temp+acessTriangle(i, j, false));
             }
          }
       }
       int result =-1;
      for(int  j=  1; j<=rows;j++){
          result =(result
       }
       returnresult;
    }
   
    private voidsetResultList(int x,int y,int value){
       int temp =(1+x-1)*(x-1)/2;
      resultList[temp+y-1]= value;
    }
   
   //以三角形的形式访问数组
    private intacessTriangle(int x ,int y,boolean isresult){
      //获取该排之前有多少个元素
       int temp =(1+x-1)*(x-1)/2;
      if(isresult){
          returnresultList[temp+y-1];
       }else{
          returnnumlist[temp+y-1];
       }
    }
}


思想上属于遍历


以上算法存在空间和时间上的冗余,   改进方案是 只开辟2个长度为三角高度的数组,一个数组存上一行对应点的最大路径,一个数组存当前输入节点的最大路劲, 然后交替使用    输入结束即可获得结果

0 0