最大连续子向量的和的问题
int a[N]; array中最大连续的subarray和是多少?
定义: maxVal 以a[i]为结尾的连续subarray的最大和。
初始值的设定:maxVal = a[0];
更新规则:
for each a[i]
temp = maxVal + a[i];
maxVal = max(a[i], temp);
#include<iostream>
#include<fstream>
using namespace std;
#define N 500
#define DEBUG
int maxsubseq(int a[], int n)
{
int max = 0;
int maxsubi = 0;
for (int i = 0; i < n; i++)
{
int tmp = maxsubi + a[i];
maxsubi = tmp > 0 ? tmp : 0;
if (maxsubi > max)
{
max = maxsubi;
}
}
return max;
}
int main()
{
#ifdef DEBUG
fstream cin("G:\\book\\algorithms\\acm\\Debug\\dat.txt");
#endif
int a[N];
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
printf("%d\n", maxsubseq(a, n));
return 0;
}
下面这个程序和上面是一样的,不同在于是将子向量的组成打印出来了。
#include<iostream>
#include<fstream>
using namespace std;
#define N 500
#define DEBUG
#define PRINT
int maxsubseq(int a[], int n)
{
int max = 0;
int maxsubi = 0;
int i;
#ifdef PRINT
int submax[N];
int e = 0, b = 0;
#endif
for (i = 0; i < n; i++)
{
int tmp = maxsubi + a[i];
maxsubi = tmp > 0 ? tmp : 0;
#ifdef PRINT
submax[i] = maxsubi;
#endif
if (maxsubi > max)
{
e = i;
max = maxsubi;
}
}
#ifdef PRINT
for(i = e; i >= 0; i--)
{
if (submax[i] == 0)
{ b = i + 1; break; }
}
printf("%d %d\n", b, e);
for (i = b; i <= e; i++)
printf("%d ", a[i]);
printf("\n");
#endif
return max;
}
int main()
{
#ifdef DEBUG
fstream cin("G:\\book\\algorithms\\acm\\Debug\\dat.txt");
#endif
int a[N];
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
printf("%d\n", maxsubseq(a, n));
return 0;
}