您的位置:首页 > 其它

online_judge_1139

2015-12-23 10:17 316 查看
#include <iostream>
#include <cstring>

using namespace std;

int main()
{
int a[101][101],dp[101][101],tmp[101][101];
int i,j,k,n,t,ans;
while(cin>>n)
{
ans = -300;
for(i=1; i<=n; ++i)
{
for(j=1; j<=n; ++j)
{
cin>>a[i][j];
if(ans < a[i][j])
ans = a[i][j];
}
}
if(ans <= 0)
{
cout<<ans<<endl;
continue;
}
memset(dp, 0, sizeof(dp));
memset(tmp, 0, sizeof(tmp));
for(i=1; i<=n; ++i)
{
for(j=1; j<=n; ++j)
{
t = 0;
for(k=j; k<=n; ++k)
{
t += a[i][k];
if(t < 0)
{
if(tmp[j][k] + t > 0)
{
tmp[j][k] = tmp[j][k] + t;
}
else
{
tmp[j][k] = 0;
}
}
else
{
tmp[j][k] += t;
if(dp[j][k] < tmp[j][k])
dp[j][k] = tmp[j][k];
}
}
}
}
ans = -300;
for(j=1; j<=n; ++j)
{
for(k=j; k<=n; ++k)
{
if(ans < dp[j][k])
ans = dp[j][k];
}
}
cout<<ans<<endl;
}
return 0;
}


很好的一道题目,最大子序列和这个考察的很到位……

同时要注意矩阵中的值都为负数的情形……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: