題目描述
背景:5月12日,在廈門人民的熱烈歡迎下,象徵著和平、友誼、聖潔的奧運火炬終於來到了廈門,開始了傳遞……
描 述:廈門市市長宣布:“要把這次火炬接力辦的很有意義。”“有意義”是什麼意思呢。廈門市市長別出心裁地給它下了個定義:每個火炬手都有個意義值,可以將 他們順次看作一個首尾相接的環,而整個火炬接力的意義值是這個環的最大和連續子串。
比如: 串是 -2 2 0 1 -48 1,顯然其最大和連續子串是2 0 1,其和是3。
現在給定n個火炬手的意義值,請算出整個火炬接力的意義值(意義值可能為負數) 輸入格式
第1行一個整數n(1<=n<=1000000)表示n個火炬手
第2行有n個整數,每個整數都在 longint的範圍內。
新備忘:因為未知原因,導致正常程式在測評8 9 10三個測試點時TLE,所以本題暫時關閉後3個測試點。資料範圍改為5000 輸出格式
火炬接力的意義值。 範例輸入
2 1 3 範例輸出
4
三維狀態映像
最長子串和,化環為鏈
#include<iostream> #define maxn 5000 using namespace std; long a[2*(maxn+1)],ans; int main(){ long n; cin>>n; for (long i=1;i<=n;++i){ cin>>a[i]; if (a[i]<0) ++ans; } if (ans==n){ ans=INT_MIN; for (long i=1;i<=n;++i) if (a[i]>ans) ans=a[i]; } else{ ans=0; for (long i=1;i<=n;++i) a[i+n]=a[i]; for (long start=1;start<=n;++start){ long temp=0; for (long i=start;i-start+1<=n;++i){ if (temp+a[i]<0) temp=0; else temp+=a[i]; if (temp>ans) ans=temp; } } } cout<<ans<<endl; return 0; }