1. 程式人生 > >51Nod 1050 循環數組最大子段和 | DP

51Nod 1050 循環數組最大子段和 | DP

urn F12 int ges href 中間 art space style

技術分享

Input示例
6
-2
11
-4
13
-5
-2
Output示例
20

分析:

有兩種可能,第一種為正常從[1 - n]序列中的最大子字段和;第二種為數組的total_sum - ([1-n]序列中的最短序列和)

最後結果為 max { 第一種, 第二種}。 對於第二種:

循環數組求最大子段和,可能出現中間的一部分不要,要兩邊的數。比如:-1 4 -1 -5 5 -2 1 -1 3,他的最大子段和就為 左邊的-1 4加上右邊的5 -2 1 -1 3,也就是,去掉1 -5這一段後的結果。而-1 -5這一段其實是最小字段和(序列總和一定,總和 - 最大子段和 = 最小子段和)

#include "
iostream" #include "cstdio" using namespace std; #define LL long long #define N 50010 int arr[N]; int main(){ int n; LL sum,sum01,sum02; while(~scanf("%d",&n)){ sum=0;sum01=0;sum02=0; for(int i=0;i<n;i++){ scanf("%d",&arr[i]); sum+=arr[i]; } LL ans
=0; for(int i=0;i<n;i++){ sum01+=arr[i]; sum02-=arr[i]; if(sum01<0)sum01=0; if(sum02<0)sum02=0; ans=max(ans,sum01); ans=max(ans,sum+sum02); } printf("%lld\n",ans); } return 0; }

http://blog.csdn.net/zchahaha/article/details/51759597

http://blog.csdn.net/zs120197/article/details/77669641

51Nod 1050 循環數組最大子段和 | DP