您的位置:首页 > 其它

最长连续和与最大子矩阵

2013-12-24 01:51 281 查看
1. 最长连续和

求一个串里面最长连续的子串

如:

1 2 3 -4 5 -10

最长是 1 2 3 -4 5 和7 长度5 起始1~5

算法:

这应该是一个很简单的问题, 倒是本人想复杂了, 耗时不少呀~

不说, 贴代码, 主要是sum的作用, 细细体会:

for(i=0;i<N;i++)
scanf("%d",&a[i]);

int x = 1,y = 1;
int flag = 1;
int sum = 0;
int ans = -INF;
for(int i = 1;i <= N;i ++)
{
sum += a[i];
if(sum > ans)
{
ans = sum;
x = flag;
y = i;
}
if(sum < 0)//这里 不能是else 要考虑所有数为负数
{
sum = 0;flag = i+1;
}
}

2. 最大子矩阵
和上面类似, 只是换成了二维

矩阵压缩, 把第I到第N行压缩到一行上

int temp[MAX],map[MAX][MAX];
int getsum()
{
int sum = 0,max = -INF;
for(int i = 1;i <= M; i ++)
{
sum += temp[i];
if(sum > max) max = sum;
if(sum < 0) sum = 0;
}
return max;
}
int main()
{
for(int i = 1;i <= N; i ++)
for(int j = 1;j <= M; j ++)
scanf("%d",&map[i][j]);

int ans = -INF;
for(int i = 1; i <= N; i ++)//从第i行开始
{
memset(temp,0,sizeof(temp));
for(int j = i; j <= N; j ++)//从i行到N行都尝试叠加上去
{
for(int k = 1; k <= M; k ++)//把i到j行的每一列加起来。。。就是矩阵压缩
temp[k] += map[j][k];

int pre = getsum();//计算压缩的一维连续区间最大和
if(ans < pre)
ans = pre;
}
}
return 0;
}
hdu1003 hdu1081
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法