題目描述
給出一段環狀序列,即認為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 個數是相鄰的。輸出格式...