题目意思就是说给你一个n*m的矩阵,让你求出最大的子矩阵和。
看了一下数据范围 好大。。。不过O()还是过了。。hh...。刚开始还脑can写了个dp,没写对。(为自己的智商感到担忧。。)
正确思路:对每一行进行一个前缀和 sum[i][j] 表示 第i行前j个数的和。然后进行三层for循环 。第一层循环的是从第i列开始,第二层循环的是到第j列结束,第三层循环的是前k行。注意初始化最大值为sum[1][1]。因为矩阵中的数有可能全是负数。最大值小于0
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 505;//矩阵规模
int sum[maxn][maxn];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>sum[i][j];
sum[i][j] += sum[i][j-1];
}
}
int maxs = sum[1][1];
for(int i=1;i<=m;i++)
{
for(int j=i;j<=m;j++)
{
int s = 0;
for(int k=1;k<=n;k++)
{
s = s + sum[k][j] - sum[k][i-1];
if(s > maxs) maxs = s; // 如果当前子矩阵的值大于maxs
if(s < 0) s = 0;//如果当前子矩阵的值小于0 则前面的都不能要。
}
}
}
cout<<maxs<<endl;
return 0;
}