您的位置:首页 > 其它

【贪心\最大连续区间和】游览路线

2012-10-29 19:09 344 查看




求最大连续区间和的水题

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <functional>
using std::min;
using std::max;

long getint()
{
long rs=0;bool sgn=-1;char tmp;
do tmp=getchar();
while (!isdigit(tmp)&&tmp-'-');
if (tmp=='-'){sgn=0;tmp=getchar();}
do rs=(rs<<3)+(rs<<1)+tmp-'0';
while (isdigit(tmp=getchar()));
return sgn?rs:-rs;
}

long a[3010][510];
long b[510];
long que[510];
long sum[510];
long ans = -0x3f3f3f3f;

int main()
{
freopen("travel.in","r",stdin);
freopen("travel.out","w",stdout);

long n = getint();
long m = getint();
for (long i=1;i<n+1;i++)
for (long j=1;j<m+1;j++)
a[i][j] = getint();

for (long j=1;j<m+1;j++)
{
b[j] = -0x3f3f3f3f;
for (long i=1;i<n+1;i++)
{
b[j] = max(b[j],a[i][j]);
}
sum[j] = sum[j-1]+b[j];
}

long l = 0;
long r = 0;
r ++;
que[r] = 0;
for (long i=1;i<m+1;i++)
{
while (l<r && que[r]>=sum[i]) r--;
que[++r] = sum[i];
ans = max(ans,sum[i]-que[l+1]);
}
printf("%ld",ans);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: