数组求和(二)
題目:求一個二維數組中的最大子數組的和
分析:以前做過一個一位數組的求和,現在改為二維數組,復雜了很多,但基本思想不變。經過幾天的討論,與程序的修改,實現了題目的要求。源代碼如下:
package com.su.test; ???????public?class?Hellosu { ????public?static?void?main(String[] args) ????{ ?????????//測試用例 ??????int?b[][]={{3,4,-7},{7,2,0},{-11,3,0}}; ??????int?max=maxSubMatrix(b,b.length,b[0].length); ??????System.out.println(max);? ????} ????public?static??int?maxSubArray(int?ar[],int?n)??? //一維數組最大子數組 ????{ ????????int?max=ar[0]; ????????int?k[]=new?int[3]; ????????int?b=ar[0]; ????????int?i; ????????for(i=1;i<n;i++) ????????{ ???????????if(b>0) ???????????{ ???????????????b+=ar[i];?? ???????????} ???????????else ???????????{ ???????????????b=ar[i]; ???????????} ???????????? ???????????if(b>max) ???????????{ ???????????????max=b; ???????????} ????????}?? ????????return?max; ????} ????public?static??int?maxSubMatrix(int?p[][],int?m,int?n)??? //二維數組最大子矩陣 ????{ ??????????int?i,j,k,max=p[0][0],tempt; ?????????//記錄每行的和 ?????????int?last_i=0,last_j=0; ?????????int?sum[]=new?int[m]; ????????for(i=0;i<n;i++) ???????{ ????????????for(k=0;k<m;k++) ?????????????sum[k]=0; ?????????????????for(j=i;j<n;j++) ????????????????{ ????????????????????for(k=0;k<m;k++) ???????????????????{ ?????????????????????sum[k]+=p[k][j]; ???????????????????} ????????????????????tempt=maxSubArray(sum,m); ????????????????????if(tempt>max) ????????????????????{ ?????????????????????last_i=i; ?????????????????????last_j=j; ?????????????????????max=tempt; ????????????????????} ????????????????} ????????????} ??????????System.out.println("從第"+(last_i+1)+"列開始,到第"+(last_j+1)+"結束"); ??????return?max; ????} ?} 總結:結對開發是我們練習的重點,主要是形成一個習慣:能設計算法,并且具有可讀性;能找出別人寫的代碼中的錯誤,或者能簡化程序代碼。?
轉載于:https://www.cnblogs.com/wuwei123/p/3611862.html
總結
- 上一篇: 羊群过河问题
- 下一篇: PHP工厂模式的研究