noip模擬賽 某種數列問題

2022-05-01 09:42:08 字數 1544 閱讀 2163

眾所周知,chenzeyu97有無數的妹子(阿掉!>_<),而且他還有很多惡趣味的問題,繼上次糾結於一排妹子的排法以後,今天他有非(chi)常(bao)認(cheng)真(zhe)去研究乙個奇怪的問題。有一堆他的妹子站成一排,然後對於每個妹子有乙個美麗度,當然美麗度越大越好,chenzeyu97妹子很多,但是質量上不容樂觀,經常出現很多美麗度為負數的妹子(喜聞樂見),chenzeyu97希望從一排妹子裡找出3隊連續的妹子,使她們的美麗度和最大。注意,乙個妹子不能被編入多個隊伍而且一定要拿出三隊,不然czy會閒著沒事做~。

簡單滴說就是:

給定乙個數列,從中找到3個無交集的連續子數列使其和最大。

輸入格式:

第一行乙個數n,表示數列長度。

接下來有n行,每行乙個數,第i行為第i個數。

輸出格式:

僅有乙個數,表示最大和。

輸入樣例#1:

10-12

3-401

-6-1

1-2

輸出樣例#1:

7

【樣例說明】

第一隊妹子取2,3。

第二隊妹子取0,1。

第三隊妹子取1。

請大家放心,雖然chenzeyu97妹子無數,但是這次他叫來的個數n是有限的。=v=

對於30%的資料,妹子數不大於200。

對於60%的資料,妹子數不大於2000。

對於100%的資料,妹子數1000000。

而且,由於chenzeyu97沒有ccr那樣的影響力,所以他的妹子選完的最大美麗度和不超過maxlongint。(注:ccr隨便選就爆long long,因為他是把妹狂魔=v=)。

分析:這道題其實和子串那道題類似,演算法肯定是o(n)的演算法,考慮dp,設f[i][j][k]表示前i位選了j隊,第i位選不選,那麼遞推式就很容易看出來:

f[i][j][0] = max(f[i-1][j][1],f[i-1][j][0])

f[i][j][1] = max(f[i-1][j-1][0],f[i-1][j-1][1],f[i-1][j][1]) + a[i] (選i的話要麼和前面乙個數合併成乙個隊要麼還要再開一隊).

像這類一共有n個元素的排列,每個元素要麼選或不選,最多只能有k個區間的問題的解法都是差不多的,用一維表示選到了第幾位,用一維表示選了幾個區間,還要用一維表示選不選,有的時候可能還要開乙個陣列來記錄輔助資訊.

#include #include 

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 1000010

;long

long a[maxn], f[maxn][4][2

],n;

intmain()

printf(

"%lld\n

", max(f[n][3][0], f[n][3][1

]));

return0;

}

NOIP模擬賽 某種數列問題

眾所周知,chenzeyu97有無數的妹子 阿掉!而且他還有很多惡趣味的問題,繼上次糾結於一排妹子的排法以後,今天他有非 chi 常 bao 認 cheng 真 zhe 去研究乙個奇怪的問題。有一堆他的妹子站成一排,然後對於每個妹子有乙個美麗度,當然美麗度越大越好,chenzeyu97妹子很多,但是...

某種數列問題

某種數列問題 jx.cpp c pas 1000ms 256mb 眾所周知,chenzeyu97有無數的妹子 阿掉!而且他還有很多惡趣味的問題,繼上次糾結於一排妹子的排法以後,今天他有非 chi 常 bao 認 cheng 真 zhe 去研究乙個奇怪的問題。有一堆他的妹子站成一排,然後對於每個妹子有...

noip模擬賽 數列

分析 打個表,會發現a1,a2中較小的乙個數會出現很多次,把這些數刪掉,就會形成若干個等差數列,每個等差數列中新出現的數的個數是a1a2較大者除以較小者.之後取個餘,繼續做重複的操作就行了.include include include include using namespace std int...