首先要熟悉一下最大子段和(即最大连续子串的和),给一串数字,找到最大子段和的值。
一般方法是dp,
dp[i]表示以a[i]为结尾的最大子段和,那么dp[i]=max(dp[i-1]+a[i],a[i]);(即,当dp[i-1]<0时,dp[i]=a[i],否则dp[i]=dp[i-1]+a[i];)
有了一维的基础,现在来看看矩阵的情况。
设数组tal[]的每一个元素为第r行到第i行的对应列元素之和。(即tal[k]=map[r][k]+map[r+1][k]+...+map[i][k]);
那么最大矩阵和,就变成了一维的最大子段和。
枚举第r行到第i行,找到最优值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MAX 111
using namespace std;
int map[MAX][MAX];
int tal[MAX];
int ans,n;
int dp() //求最大子段和函数
{
int sum=0,i,j,M=0;
for(i=1;i<=n;i++)
{
sum+=tal[i];
if(sum>M) M=sum;
if(sum<0) sum=0;
}
return M;
}
int main()
{
int i,j,r;
scanf("%d",&n);
ans=-200;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
scanf("%d,",&map[i][j]);
}
for(r=1;r<=n;r++) //第r行
{
memset(tal,0,sizeof(tal));
for(i=r;i<=n;i++) //第i行
{
for(j=1;j<=n;j++) //第j列
{
tal[j]+=map[i][j];
}
int temp=dp();
if(ans<temp)
ans=temp;
}
}
printf("%d\n",ans);
return 0;
}