51nod 1050 迴圈陣列最大和

2021-09-03 09:53:15 字數 836 閱讀 8814

感覺自己的碼力還很差 思維愚鈍

一開始把他搞成2倍長度來做

然後列舉每乙個始點加長度為n的陣列跑乙個dp 

這樣複雜度高達o(n^2)

實際上我們可以分析一下 這個max有可能在1 --》n內取到  也有在迴圈陣列中取到

所以我們先跑一段1--》n的dp 記為ans1

然後我們跑一段迴圈陣列內的dp 記為ans2

關於迴圈陣列內的dp

我們先把迴圈陣列置反然後求出跑dp求出最大和再用總和sum減去ans2

ans2是負最大區間的正值

所以這個答案最大值就是 sum-(-ans2)

即從總和中剔除負最大區間

#includeusing namespace std;

typedef long long ll;

const int maxn=1e5+100;

ll a[maxn*2];

ll dp[maxn*2];

int main()

ll ans1=0,ans2=0;

//for(int i=1;i<=2*n;i++)

// dp[1]=a[1];

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++) a[i]=-a[i];

dp[1]=a[1];

for(int i=1;i<=n;i++)

ans1=max(ans1,sum+ans2);

if(flag)

printf("%lld",ans1);

else

printf("0");

}

51nod 1050 迴圈陣列最大子段和

n個整數組成的迴圈序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的連續的子段和的最大值 迴圈序列是指n個數圍成乙個圈,因此需要考慮a n 1 a n a 1 a 2 這樣的序列 當所給的整數均為負數時和為0。例如 2,11,4,13,5,2,和最大的子段為 11,4,13...

51nod 1050 迴圈陣列最大子段和

51nod 1050 迴圈陣列最大子段和 最大子段和的公升級版,有乙個可以迴圈的子段,也就是首尾可以相連,如果首尾相連,那麼中間空出來的一段就是應該是最小字段和。那麼答案應該是從原版得出的值和首尾相接得出的值取最大的即可。include include include include include...

51nod 1050 迴圈陣列最大欄位和

題目 n個整數組成的迴圈序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的連續的子段和的最大值 迴圈序列是指n個數圍成乙個圈,因此需要考慮a n 1 a n a 1 a 2 這樣的序列 當所給的整數均為負數時和為0。例如 2,11,4,13,5,2,和最大的子段為 11,4...