關於求最大子段和的演算法,點擊此處連結:最大子段演算法
/** 先從左至右掃描,記下最大子串dp1[];再從右至左掃描,記下dp2[]; 最後枚舉從0到n-1的i;找出最大的dp1[i]+dp2[i+1] 即為所求; 找最大子串dp[i]的方法是: 先把從第一個到後面每個數的和求出來,放在數組dp[i]中,再搞個迴圈, 更新dp[i]為到第i個數的最大子段和;**/#include <stdio.h>int main(){ int T, n, i, a[50000], dp1[50000], dp2[50000], max; scanf("%d", &T); while (T--) { scanf("%d", &n); scanf("%d", &a[0]); dp1[0] = a[0]; for (i=1; i<n; i++) //在輸入的同時求和,節約時間 { scanf("%d", &a[i]); if (dp1[i-1] > 0) dp1[i] = dp1[i-1] + a[i]; else dp1[i] = a[i]; } for (i=1; i<n; i++) //再次掃描更新最大子段和 { if (dp1[i] < dp1[i-1]) dp1[i] = dp1[i-1]; } dp2[n-1] = a[n-1]; for (i=n-2; i>=0; i--) //從右往左求和 { if (dp2[i+1] > 0) dp2[i] = dp2[i+1] + a[i]; else dp2[i] = a[i]; } for (i=n-2; i>=0; i--) //更新 { if (dp2[i] < dp2[i+1]) dp2[i] = dp2[i+1]; } max = dp1[0] + dp2[1]; for (i=1; i<n-1; i++) { if (dp1[i] + dp2[i+1] > max) max = dp1[i] + dp2[i+1]; } printf("%d/n", max); }}