首页 > 代码库 > 1、2维最大子段和
1、2维最大子段和
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAX 1000
int MaxSubInterval(int a[], int n) //标准的一维最大子段和
{
int sum = 0, tp = 0;
for(int i=0; i<n; i++)
{
if(tp > 0)
tp += a[i];
else
tp = a[i];
if(sum < tp)
sum = tp;
}
return sum;
}
int MaxSubMartix(int a[][MAX], int m, int n) //二维最大子段和问题
{
int tp[MAX], sum = 0;
for(int i=0; i<m; i++)
{
memset(tp, 0, sizeof(tp) );
for(int j=i; j<m; j++)
{
for(int k=0; k<n; k++)
tp[k] += a[j][k];
int max = MaxSubInterval(tp, n);
if(max > sum) sum = max;
}
}
return sum;
}
/*
int MaxSubInterval(int a[], int n, int size_y) //一维的n个数的最大子段和
{
int sum = 0, tp;
for(int i=0; i<n-size_y; i++)
{
tp = 0;
for(int j=i; j<i+size_y; j++)
{
if(tp > 0)
tp += a[j];
else
tp = a[j];
}
if(sum < tp)
sum = tp;
}
return sum;
}
int MaxSubMartix(int a[][MAX], int m, int n, int size_x, int size_y) //二维size_x * size_y 个数的最大子段和
{
int tp[MAX], sum = 0;
for(int i=0; i<m-size_x; i++)
{
memset(tp, 0, sizeof(tp) );
for(int j=i; j<i+size_x; j++)
{
for(int k=0; k<n; k++)
tp[k] += a[j][k];
}
int max = MaxSubInterval(tp, n, size_y);
if(max > sum) sum = max;
}
return sum;
}
*/
来自为知笔记(Wiz)
附件列表
1、2维最大子段和
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。