洛谷 P1121 環狀最大兩段子段和

2021-07-24 08:14:25 字數 1068 閱讀 1184

題目描述

給出一段環狀序列,即認為a[1]和a[n]是相鄰的,選出其中連續不重疊且非空的兩段使得這兩段和最大。

輸入輸出格式

輸入格式:

輸入檔案maxsum2.in的第一行是乙個正整數n,表示了序列的長度。

第2行包含n個絕對值不大於10000的整數a[i],描述了這段序列,第乙個數和第n個數是相鄰的。

輸出格式:

輸入檔案maxsum2.out僅包括1個整數,為最大的兩段子段和是多少。

輸入輸出樣例

輸入樣例#1:

7 2 -4 3 -1 2 -4 3

輸出樣例#1:

說明【樣例說明】

一段為3

【分析】

有趣的dp題

最大子段和無非就有兩種情況.

(1)跨區間的.

(2)在[1,n]中的.

然後難搞的可能是(1).

然後我們換個思路.

我們在[1,n]中求乙個最小字首/字尾和.

然後用sum減去即可.

正確性是顯然的.

因為求最小的時候我們預設包括[i,i+1].

這段不選的最小子段區間必定是連續的.

故選的必定為1段(如果選的是[1,i],[i+1,n]這一段

我們也可以認為它們是分開選的兩段)

【**】

//環狀最大子段和 

#include#include#define fo(i,j,k) for(i=j;i<=k;i++)

using namespace std;

const int mxn=200005;

int maxl[mxn],minl[mxn],maxr[mxn],minr[mxn],a[mxn];

int main()

mx=mn=maxr[n]=minr[n]=a[n];

for(i=n-1;i;i--)

fo(i,1,n-1)

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

return0;}

//7//2 -4 3 -1 2 -4 3

P1121 環狀最大兩段子段和

p1121 環狀最大兩段子段和 給出一段環狀序列,選出其中連續不重疊且非空的兩段使得這兩段和最大。n 2e5 輸入樣例 1 複製 7 2 4 3 1 2 4 3 輸出樣例 1 複製 9 題解 一道好題 考慮兩種情況,o代表選擇 ooo ooo 正做一遍最大子段和,倒做一遍最大子段和兩者相加 ooo ...

P1121 環狀最大兩段子段和 DP

p1121 環狀最大兩段子段和 難度提高 省選 題目描述 給出一段環狀序列,即認為a 1 和a n 是相鄰的,選出其中連續不重疊且非空的兩段使得這兩段和最大。輸入輸出格式 輸入格式 輸入檔案maxsum2.in的第一行是乙個正整數n,表示了序列的長度。第2行包含n個絕對值不大於10000的整數a i...

洛谷 P1121 環狀最大兩段子段和 解題報告

給出一段環狀序列,即認為 a 1 和 a n 是相鄰的,選出其中連續不重疊且非空的兩段使得這兩段和最大。輸入輸出格式 輸入格式 第一行是乙個正整數 n n 2 10 5 表示了序列的長度。第二行包含 n 個絕對值不大於10000的整數 a i 描述了這段序列,第乙個數和第 n 個數是相鄰的。輸出格式...