面试题四十七:礼物的最大值

 

在m*n的棋盘中,每一格放一个礼物,只能向左或下走,求右下角礼物的最大值;
方法一:创建辅助数组,数组中的每一个值表示上面还有左边结果的最大值

 int Max_vaule(int array[][]) {
             if(array==null||array.length<0) return 0;
             int m=array.length;
             int n=array[0].length;
             int[] []B=new int [m][n];
             B[0][0]=array[0][0];
             for(int i=0;i<m;i++) {
                  for(int j=0;j<n;j++) {
                      int L=array[i][j];
                      int T=array[i][j];
                      if(i>0)
                           L+=B[i-1][j];
                      if(j>0)
                           T+=B[i][j-1];
                      B[i][j]=L;
                      if(T>L)
                           B[i][j]=T;
                  }
             }
             return B[m-1][n-1];
         }

方法二:对方法一的优化,节省空间,用一维数组代替二维,数组本身每一位存储上面行对应位的最大累计值;

 int Max_vaule(int array[][]) {
             if(array==null||array.length<0) return 0;
             int m=array.length;
             int n=array[0].length;
             int[] B=new int [n];
             for(int i=0;i<m;i++) {
                  for(int j=0;j<n;j++) {
                      int L=array[i][j];
                      int T=array[i][j];
                      if(i>0)
                           L+=B[j];
                      if(j>0)
                           T+=B[j-1];
                      B[j]=L;
                      if(T>L)
                           B[j]=T;
                  }
             }
             return B[n-1];
         }

 

posted @ 2020-03-29 16:41  浪波激泥  阅读(262)  评论(0编辑  收藏  举报