题目大意,给出一个N*N的矩阵,求最大子矩阵之和。
假设最大子矩阵为n*m,就是求以n为宽度的数组的最大递增子序列,扫一遍就可以了。
#include<iostream>
#include<cstring>
#include<cmath>
#include<map>
#include<algorithm>
#include<stdio.h>
#include<string>
using namespace std;
#define MAX -0x7fffffff
#define N 105
int s[N][N];
int dp[N],maxx;
int main()
{
// cout<<MAX<<endl;
int i,j,k,n;
while(cin>>n)
{
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&k);
s[i][j]=s[i-1][j]+k;
}
}
/* for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
cout<<s[i][j]<<' ';
}
cout<<endl;
}*/
maxx=MAX;
for(i=0;i<n;i++)
{
for(j=1;j+i<=n;j++)
{
dp[1]=s[j+i][1]-s[j-1][1];
maxx = max(dp[1],maxx);
for(k=2;k<=n;k++)
{
int l=s[j+i][k]-s[j-1][k];
if(dp[k-1]>0)
dp[k]=dp[k-1]+l;
else
dp[k]=l;
maxx=max(maxx,dp[k]);
}
}
}
cout<<maxx<<endl;
}
return 0;
}