资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
给定一个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 #include<iostream> 2 #include<string.h> 3 #define ll long long int 4 #define INF 0x3f3f3f3f 5 using namespace std; 6 int main(){ 7 int n,m; 8 int num; 9 int dp[505][505]; 10 memset(dp,0,sizeof(dp)); 11 cin>>n>>m; 12 for(int i=1;i<=n;i++){ 13 for(int j=1;j<=m;j++){ 14 cin>>num; 15 dp[i][j]=dp[i-1][j]+num; 16 17 } 18 } 19 int temp; 20 int ans; 21 int maxx=-INF; 22 for(int base=1;base<=n;base++){ 23 for(int top=1;top<=base;top++){ 24 25 temp=0; 26 for(int left=1;left<=m;left++){ 27 temp+=dp[base][left]-dp[top-1][left]; 28 if(temp>maxx){ 29 maxx=temp; 30 } 31 if(temp<0)//如果前面的temp计算的值为负数,只会造成后续计算的值的减少 32 //对于求最大的值没有意义,那么就令其为0,从下一列重新计算 33 //另外,举一反三,如果求最小值,temp为负数对求最小值有贡献, 34 //那么就要当temp>0时,令temp=0 35 temp=0; 36 } 37 38 } 39 } 40 cout<<maxx<<endl; 41 }