1. 程式人生 > >動態規劃專題—最大連續子序列和—A1007

動態規劃專題—最大連續子序列和—A1007

最大連續子序列和問題如下

給定一個數字序列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; }