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