藍橋杯 最大子陣

問題描述
  給定一個n*m的矩陣A,求A中的一個非空子矩陣,使這個子矩陣中的元素和最大。

其中,A的子矩陣指在A中行和列均連續的一塊。
輸入格式
  輸入的第一行包含兩個整數n, m,分別表示矩陣A的行數和列數。
  接下來n行,每行m個整數,表示矩陣A。
輸出格式
  輸出一行,包含一個整數,表示A中最大的子矩陣中的元素和。
樣例輸入
3 3
-1 -4 3
3 4 -1
-5 -2 8
樣例輸出
10
樣例說明
  取最後一列,和爲10。
數據規模和約定
  對於50%的數據,1<=n, m<=50;
  對於100%的數據,1<=n, m<=500,A中每個元素的絕對值不超過5000。

題目大意:

  1. 求連續行、列的子矩陣的最大元素和。
  2. 由於行、列必須是連續的,所以可以求出每一列前n行的和,前綴和
  3. 然後再枚舉一個 行的開始和結束,然後再用最大字段和求出最大和
    最大連續子序列和的二維版
import java.util.*;
public class Main{
	public static int ma(int[] h,int m){//求最大連續子序列和
		int a,n=0,max=-10000;
		for(int i=0;i<m;i++){//注意這時是求一行中的最大連續子序列和,所以是到m
			if(n>0)n+=h[i];
			else n=h[i];
			max=Math.max(max,n);
		}
		return max;
	}
	public static void main(String[] args){
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt(),m=sc.nextInt(),ans=-100000,max;
		int[][] mp=new int[n][m];
		int[] h=new int[m];////存儲第i列的前n行的和
		for(int i=0;i<n;i++)//讀入數據
			for(int j=0;j<m;j++)mp[i][j]=sc.nextInt();
		for(int i=0;i<n;i++){//i爲開始行
			for(int j=0;j<m;j++)h[j]=0;//初始化
			for(int j=i;j<n;j++){//j爲結束行,從i行加到j行
				for(int z=0;z<m;z++)h[z]+=mp[j][z];//累加第z列的前n項和
				//注意邊加就開始求他的最大值,然後動態更新
				ans=Math.max(ma(h,m),ans);//每次更新最大值
			}
		}
		System.out.println(ans);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章