P1121 環狀最大兩段子段和 DP

2021-07-23 17:46:03 字數 1377 閱讀 4842

p1121 環狀最大兩段子段和

難度提高+/省選-

題目描述

給出一段環狀序列,即認為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:

9 說明

【樣例說明】

一段為3

/*

dp.最大子段和問題.

n^2的做法是

拆成鏈對每乙個區間維護最大字首/字尾和.

然後列舉斷點.

這個很好想但過不了so沒打(懶~).

看了看題解orz.

恩o(n).

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

(1)跨區間的.

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

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

然後我們換個思路.

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

然後用sum減去即可.

正確性是顯然的.

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

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

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

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

*/#include

#include

#define maxn 200001

using

namespace

std;

int maxl[maxn],maxr[maxn],minl[maxn],minr[maxn],n,s[maxn],sum,ans=-1e9,max1,min1;

int read()

while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();

return x*f;

}int main()

maxr[n]=minr[n]=max1=min1=s[n];

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

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

printf("%d",ans);

return

0;}

P1121 環狀最大兩段子段和

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

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

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

動態規劃 P1121 環狀最大兩段子段和

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