迴圈陣列最大子段和 dp

2021-08-06 01:56:04 字數 1453 閱讀 6897

n個整數組成的迴圈序列a11,a22,a33,…,ann,求該序列如aii+ai+1i+1+…+ajj的連續的子段和的最大值(迴圈序列是指n個數圍成乙個圈,因此需要考慮an−1n−1,ann,a11,a22這樣的序列)。當所給的整數均為負數時和為0。

例如:-2,11,-4,13,-5,-2,和最大的子段為:11,-4,13。和為20。

input

第1行:整數序列的長度n(2 <= n <= 50000)

第2 - n+1行:n個整數 (-10^9 <= sii <= 10^9)

output

輸出迴圈陣列的最大子段和。

sample input6-2

11-4

13-5

-2sample output20

如果最大和在不迴圈的情況下得到,我們可以按照最大的連續子串行和的方法找到乙個最大的和maxsum;如果最大和的在迴圈的情況下得到,我們我們可以求乙個最小連續子串行的和minsum,用陣列總和tot-minsum就是在迴圈的情況下最大和;最終答案取兩者最大值ans = max

ac**:

#include #include #include #include #include #include #include #include #include #include using namespace std;

#define cl(a) memset(a,0,sizeof(a));

#define ll long long

const int inf= 0x7fffffff;

const int maxn = 1e6 + 100;

ll a[maxn];

int main()

maxsum = sum = 0;

minsum = inf;

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

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

ans = max(maxsum,tot - minsum);

printf("%lld\n",ans);

}return 0;

}

取反也可以:

#include#include#include#include#include#include#include#include#include#include#include#includetypedef long long ll;

using namespace std;

ll a[50050],dp[55000];

int main()

if(!flag)

else

sum=0;

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

printf("%i64d\n",max(ans1,t+ans2));

}return 0;

}

迴圈陣列最大子段和(DP)

輸入 第1行 整數序列的長度n 2 n 50000 第2 n 1行 n個整數 10 9 s i 10 9 輸出輸出迴圈陣列的最大子段和。輸入示例 6 2 11 4 13 5 2輸出示例 分析 1 笨方法,我們可以用普通最大子段和的方法解決這個問題。我們從每個位置 斷開 環,然後按普通的最大子段和的方...

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

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...

hpuoj 迴圈陣列最大子段和

時間限制 1 sec 記憶體限制 128 mb 提交 19 解決 6 狀態kaca在做了最大子段和問題之後,思考若陣列可以首尾相接的話最大子段和應該是多少。有多組測試資料。每一組的第一行是乙個整數n n。下面一行是n n個以空格分開的整數a i ai。1 n 10000 1 n 10000 0 ai...