1. 程式人生 > >二維表的中的最大子表求和

二維表的中的最大子表求和

技術分享 實時更新 矩形 string inf ring void 維表 求和

  這此實驗的設計思路:暫時用的是最笨的方法,首先確定初始點(左上角的元素)之後確定末尾點(右下角的元素),之後運用簡單的遍歷進行加和,然後與暫時的最大子二維表的和進行比較,保留最大的,以此類推。(初始設計思路是:(1)求出對角線及對角線之外的幾個二維表的和,(2)然後在他們的基礎上減去所求子二維表中不包含的行和列,(3)再加上重復減去的元素,進而求出最大的子二維表的和,但由於(2)環節沒有好的實行思路和時間原因,所以這個原始的設計思路被暫且擱置了)

package erweishuzu;

import java.util.Scanner;

public class erweishuzu {
     
public static void main(String[] args) { int a_hang=0,z_hang=0,a_lie=0,z_lie=0;//記錄初始點和末尾點的行和列 /* int hang[] = new int [3];//存儲每一行的總值 int lie[] = new int [3];//存儲每一列的總值 int max[] = new int [3];//存儲每個最大矩形 int hangsum = 0 ;//記錄每一行總值 int liesum = 0;//記錄每一列總值 int sum=0 ;//記錄二維數組的總值 int nhang=0;//記錄行的第序 int nlie=0;//記錄列的第序 int jieti;//記錄大階梯二維表第序 int dingwei;
*/ Scanner input = new Scanner(System.in); /* max[0]=erwei[0][0];//記錄左上角一個元素的二維表 //計算對角線矩陣值 和 每一行的總值 for(z_hang=0;z_hang<3;z_hang++) { for(z_lie=0;z_lie<3;z_lie++) { hangsum=hangsum+erwei[z_hang][z_lie]; //記錄每 行 的總值 sum=sum+erwei[z_hang][z_lie]; } hang[nhang]=hangsum;//行總值存儲於對應的數組 hangsum=0; System.out.println(hang[nhang] + " 第" + (nhang+1) + "行"); nhang++; } //記錄整體矩陣的總值 max[2]=sum;//全部數據的總值 //計算每一列的總值 for(z_lie=0;z_lie<3;z_lie++) { for(z_hang=0;z_hang<3;z_hang++) { liesum=liesum+erwei[z_hang][z_lie]; //記錄每 列 的總值 } lie[nlie]=liesum;//列總值存儲於對應的數組 liesum=0; System.out.println(lie[nlie] + " 第" + (nlie+1) + "列"); nlie++; } //計算每個階梯矩形的總值 for(jieti=2;jieti>1;jieti--) { max[(jieti-1)]=max[jieti]-hang[jieti]-lie[jieti]+erwei[jieti][jieti]; System.out.println("第一矩陣:" + max[jieti] + " 第二矩陣:" + max[jieti-1] + " 第三矩陣:" + max[0]); }
*/ int zhenshi_hang,zhenshi_lie,m,n; System.out.print("請輸入二維表的行數: "); m=input.nextInt(); System.out.print("請輸入二維表的列數: "); n=input.nextInt(); int erwei[][] = new int [m][n]; for(zhenshi_hang=0;zhenshi_hang<m;zhenshi_hang++) { System.out.print("請輸入第" + (zhenshi_hang+1) + "行的" + n + "個數:"); for(zhenshi_lie=0;zhenshi_lie<n;zhenshi_lie++) { erwei[zhenshi_hang][zhenshi_lie]=input.nextInt(); } } System.out.println(" *"); System.out.println(" 輸入完畢!!!"); System.out.println(" *"); System.out.println(" *"); System.out.println(" *"); System.out.println(" *"); System.out.println(" *"); int linshi_h,linshi_l,linshi_sum=0,linshi_max=0; //按順序生成初始點 for(a_hang=0;a_hang<m;a_hang++) { for(a_lie=0;a_lie<n;a_lie++) { //按順序生成末尾點 for(z_hang=a_hang;z_hang<m;z_hang++) { for(z_lie=a_lie;z_lie<n;z_lie++) { //計算兩點之間的二維表總數 for(linshi_h=a_hang;linshi_h<=z_hang;linshi_h++) { for(linshi_l=a_lie;linshi_l<=z_lie;linshi_l++) { linshi_sum=linshi_sum+erwei[linshi_h][linshi_l]; } } //實時更新最大的二維表 linshi_max=maxx(linshi_max,linshi_sum); //將臨時二維表總值歸零 linshi_sum=0; } } } } System.out.println("最大子二維數組為:" + linshi_max); } //定義的計算最大數的函數 static int maxx(int a , int b){ int max; if(a<b) { max = b; }else { max = a; } return max; } }

技術分享圖片

在這個實驗中所遇到的問題已經在前面表明,由於本人尚未查閱此實驗的已經成功代碼,所以本人還會針對前面遇到的問題進行思考,如果實在找不出解決辦法,會參考網上的有關問題的解決辦法。

二維表的中的最大子表求和