最大和
【題目描述】
N個(gè)數(shù)圍成一圈,要求從中選擇若干個(gè)連續(xù)的數(shù)(注意每個(gè)數(shù)最多只能選一次)加起來,問能形成的最大的和。
【輸入描述】第一行輸入N,表示數(shù)字的個(gè)數(shù),第二行輸入這N個(gè)數(shù)字。
【輸出描述】輸出最大和。
【樣例輸入】8
2?-4?6?-1?-4?8?-1?3
【樣例輸出】14
【數(shù)據(jù)范圍及提示】1 <= N <= 100000,答案在Longint范圍內(nèi)。
源代碼:#include<cstdio> #include<cstring> #include<algorithm> #define INF 100000000 using namespace std; int n,sum(0),i[100001],f[100001],ans=-INF,num=INF; int main() //當(dāng)數(shù)據(jù)皆為負(fù)數(shù)時(shí),什么都不會(huì)選,就是0,我覺得這樣應(yīng)該也對(duì)。 {scanf("%d",&n);for (int a=1;a<=n;a++){scanf("%d",&i[a]);sum+=i[a]; //總和。 }for (int a=1;a<=n;a++) //1~n鏈狀時(shí)的最大值。 {if (f[a-1]>0)f[a]=f[a-1]+i[a];elsef[a]=i[a];ans=max(ans,f[a]);}memset(f,0,sizeof(f)); //別忘記初始化。for(int a=1;a<=n;a++) //環(huán)狀(區(qū)間在兩端)時(shí)的最大值。 {if (f[a-1]<0)f[a]=f[a-1]+i[a];elsef[a]=i[a];num=min(num,f[a]);}ans=max(ans,sum-num); //取其優(yōu)。printf("%d",ans);return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/Ackermann/p/5709821.html
總結(jié)
- 上一篇: hdu_5761_Rower Bo(xj
- 下一篇: [刷题]算法竞赛入门经典(第2版) 4-