51Nod 1050 循環數組最大子段和 | DP
阿新 • • 發佈:2017-09-05
urn F12 int ges href 中間 art space style
http://blog.csdn.net/zs120197/article/details/77669641
Input示例
6 -2 11 -4 13 -5 -2Output示例
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
51Nod 1050 循環數組最大子段和 | DP