①求出前缀和数组
②选定起始列与终点列 求出在这之中矩阵和最大值
③改变起始列与终点列 不断更新子矩阵和最大值
#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
int mp[501][501];//前缀和数组
int n,m,x,sum;
int ans = -0x3f3f3f3f;
int main()
{
cin >> n >> m;
//把每一行都看作是最大连续子段和
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= m; j ++)
{
cin >> x;
mp[i][j] = x + mp[i][j - 1];
}
}
//三重循环
for(int i = 1; i <= m ; i ++)//确定起始列 注意是m
{
for(int j = i; j <= m ; j ++)//确定终点列 必须大于起始列
{
sum = 0;//每次求完清零
for(int k = 1; k <= n; k ++)//确定第k行的最大子段和
{
sum += mp[k][j] - mp[k][i-1];//求k行j-i列的矩阵和的值
if(sum > ans) ans = sum;//更新答案
if(sum < 0) sum = 0;//同最大子段和
}
}
}
cout << ans ;
return 0;
}
该程序读取一个n*m的矩阵,利用前缀和计算每一行的最大连续子段和,然后通过三重循环找出所有可能的子矩阵,计算并更新最大子段和。最后输出最大子段和。
439

被折叠的 条评论
为什么被折叠?



