最大连续子数列和一道很经典的算法问题,给定一个数列,其中可能有正数也可能有负数,我们的任务是找出其中连续的一个子数列(不允许空序列),使它们的和尽可能大。
为了更清晰的理解问题,首先我们先看一组数据:8
-2 6 -1 5 4 -7 2 3
第一行的8是说序列的长度是8,然后第二行有8个数字,即待计算的序列。
对于这个序列,我们的答案应该是14
,所选的数列是从第2个数到第5个数,这4个数的和是所有子数列中最大的。
动态规划算法:
dp[k] = max(0, dp[k-1]) + num[k - 1]
以第k个数字结尾的最大连续子序列的和, k>=2 && k <=n, dp[1]=num[0];
#include <stdio.h>
int sumofseq(int* num, int n)
{
int temp = num[0];
int res = num[0];
int i;
for (i = 2; i <= n; i++)
{
temp = num[i - 1] + (temp > 0 ? temp : 0);//以第i个数字结尾的最大连续子序列和
res = temp > res ? temp : res;
}
return res;
}
int main()
{
int num[] = {-2, 6, -1, 5, 4, -7, 2, 3};
int result = sumofseq(num, 8);
printf("result = %d\n", result);
return 0;
}