動態規劃專題—最大連續子序列和—A1007
阿新 • • 發佈:2019-02-06
最大連續子序列和問題如下
給定一個數字序列A1,A2,…,An,求i,j(1<=i<=j<=n),使得Ai+….+Aj最大,輸出這個最大和。
樣例:-2 11 -4 13 -5 2
1、令狀態dp[i]表示以A[i]為結尾的連續序列的最大和,則dp[0] = -2,dp[1] = 11,dp[2] = 7,dp[3] = 20,dp[4] = 15,dp[5] = 13。
2、做如下考慮,因為dp[i]要求是必須以A[i]為結尾的連續序列,那麼只有兩種情況
a、最大和序列只有一個元素,即以A[i]開始,A[i]結尾
b、最大和序列有多個元素,且從前面A[p] (p
#include<cstdio>
#include<cstring>
void maxsublinear(int a[10010], int n)
{
int i;
int curSum = 0; /* 當前序列和 */
int maxSum = 0; /* 最大序列和 */
int begin = 0, end = 0;
int out_begin = 0, out_end = 0;
int allNegative = 1;
/* 開始迴圈求子序列和 */
for (i = 0; i < n; i++)
{
curSum = curSum + a[i];
if (a[i] == 0 && allNegative)
{ out_begin = i;
out_end = i;
}
if(a[i]>=0) allNegative = 0;
/* 與最大子序列和比較,更新最大子序列和 */
if (curSum > maxSum)
{
maxSum = curSum;
end = i;
out_begin = begin;
out_end = end;
}
/* 動態規劃部分,捨棄當前和為負的子序列 */
if (curSum < 0)
{
curSum = 0;
begin = i + 1 >= n ? i : i + 1;
}
}
//situation: all the numbers are negative
if(allNegative)
{ out_end = n-1;
out_begin = 0;
}
printf("%d %d %d",maxSum,a[out_begin],a[out_end]);
}
int main()
{ int n;
int seq[10010];
scanf("%d",&n);
for(int i = 0; i<n; i++)
scanf("%d", &seq[i]);
maxsublinear(seq, n);
return 0;
}