問題描述
給定一個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。
題目大意:
- 求連續行、列的子矩陣的最大元素和。
- 由於行、列必須是連續的,所以可以求出每一列前n行的和,前綴和!
- 然後再枚舉一個 行的開始和結束,然後再用最大字段和求出最大和
最大連續子序列和的二維版
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);
}
}