面试题四十七:礼物的最大值
在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]; }
浪波激泥