您的位置:首页 > 其它

最大子序列和问题的求解

2018-01-21 11:44 337 查看

最大子序列和问题的求解

1. 三重循环

int maxsub1(int a[], int n)
{
int maxsum = 0, currsum = 0;
int i, j, k;
for (i = 0; i < n; i++)
for (j = i; j < n; j++)
{
for (currsum = 0, k = i; k <= j; k++)
currsum += a[k];
if (currsum > maxsum)
maxsum = currsum;
}
return (maxsum);
}


复杂度:

∑ni=1(∑nj=1(j−i))

∑nj=1(j−i)=(n−i)(n−i+1)2=(n−i)22+n−i2

∑ni=1((n−i)22+n−i2)=O(n3)

2. 两重循环

int maxsub2(int a[], int n)
{
int maxsum = 0, currsum = 0;
int i, j;
for (i = 0; i < n; i++)
{
for (currsum = 0, j = i; j < n; j++)
{
currsum += a[j];
if (currsum > maxsum)
maxsum = currsum;
}
}
return (maxsum);
}


3. 分治代码

int max_subseq(int a[], int first, int last)
{
int mid = (first + last) / 2;
int max_left, max_right, max_mid;
if (first > last)
return (0);
if (first == last)
return (a[first]);
max_left = max_subseq(a, first, mid);
max_right = max_subseq(a, mid + 1, last);
max_mid = find_overlap(a, first, mid, last);
if (max_left > max_right)
if (max_mid > max_left)
return (max_mid);
else
return (max_left);
else if (max_mid > max_right)
return (max_mid);
return (max_right);
}

int find_overlap(int a[], int first, int mid,int last)
{
int i, sum1 = 0, sum2 = 0, sum;
for (i = mid, sum = 0; i >= first; i--)
{
sum += a[i];
if(sum > sum1)
sum1 = sum;
}
for (i = mid + 1, sum = 0; i <= last; i++)
{
sum += a[i];
if(sum > sum2)
sum2 = sum;
}
return (sum1 + sum2);
}


4. 一重循环

int maxsub(int *a, int n)
{
int maxsum = 0;
int currsum = 0, i;
for (i = 0; i < n; i++)
{
currsum += a[i];
if (currsum > maxsum)
maxsum = currsum;
else if (currsum < 0)
currsum = 0;
}
return (maxsum);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: