做过最大子段和之后再看这题,看到相当熟悉,
不同的是,一个是一维的而这一个是二维的;
郁闷的是做了N久,里面的好几步骤都写乱了
粗心大意不可取啊
#include<iostream>
//#include<fstream>
using namespace std;
int num[110][110];
int temp[110],dp[110];
int Max;
int main()
{
int N,k;
//ifstream cin("in.txt");
while(cin>>N)
{
for(int i=1;i<=N;i++)
{
for(int j=1;j<=N;j++)
cin>>num[i][j];
}
//二维压缩为一维
for(int i=1;i<=N;i++)
{
memset(temp,0,sizeof(temp));
for(int j=i;j<=N;j++)
{
for( k=1;k<=N;k++)
{
temp[k] = num[j][k] + temp[k];
if (temp[k] + dp[k-1] > 0) //熟悉吧,求最大子段和,也可以分开些
dp[k] = temp[k] + dp[k-1];
else
dp[k] = 0;
if (Max < dp[k])
Max = dp[k];
}
}
}
cout<<Max<<endl;
}
}