题目描述
蒜头君拿到了一个矩阵,他想知道其中的最大非空子矩阵和是多少。
输入格式
第一行输入两个整数 n,m代表这个矩阵的行数和列数。
接下来n行,每行m个整数
a
i
1
,
a
i
2
,
a
i
3
⋯
a
i
m
a_{i1}, a_{i2}, a_{i3}⋯ a_{im}
ai1,ai2,ai3⋯aim。(
1
≤
m
,
n
≤
400
,
−
1
0
9
≤
a
i
j
≤
1
0
9
1 ≤ m, n ≤ 400, −10 ^{9}≤ aij ≤ 10^{9}
1≤m,n≤400,−109≤aij≤109)
输出格式
输出一个整数,代表最大非空子矩阵和,占一行。
样例输入
3 3
1 -2 3
-4 5 -6
7 -8 9
样例输出
9
代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int m,n;
static long[]dp=new long[405];
static int[][] a=new int[405][405];
static long max(long a,long b) {
return a>b?a:b;
}
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String[] token=br.readLine().split(" ");
m=Integer.parseInt(token[0]);
n=Integer.parseInt(token[1]);//输入 m,n m为行数,n为列数
for(int i=1;i<=m;i++) {
String [] token1=br.readLine().split(" ");
for(int j=1;j<=n;j++) {
a[i][j]=Integer.parseInt(token1[j-1]);
}
}
long ans=-Long.MAX_VALUE;
for(int i=1;i<=m;i++) { //从第i行开始到第j列
long[]col=new long[405];
for(int j=i;j<=m;j++) {
for(int k=1;k<=n;k++) {
col[k]+=a[j][k];
}//计算从i行到j行这个矩阵中第k列的元素元素和
//比如样例 i=1 j=2时 col[1]=1-4=-3 ,col[2]=-2+5=3,col[3]=3-6
//dp[k]表示从i行到j行结尾为k列最大的子矩阵和
dp[1]=col[1];
if(dp[1]>ans)//保证ans为最大值
ans=dp[1];
for(int k=2;k<=n;k++) {
dp[k]=max(dp[k-1]+col[k],col[k]);
ans=max(ans,dp[k]);
}
}
}
System.out.println(ans);
}
}