某種數列問題
某種數列問題 (jx.cpp/c/pas) 1000MS 256MB
眾所周知,chenzeyu97有無數的妹子(阿掉!>_<),而且他還有很多惡趣味的問題,繼上次糾結於一排妹子的排法以後,今天他有非(chi)常(bao)認(cheng)真(zhe)去研究一個奇怪的問題。有一堆他的妹子站成一排,然後對於每個妹子有一個美麗度,當然美麗度越大越好,chenzeyu97妹子很多,但是質量上不容樂觀,經常出現很多美麗度為負數的妹子(喜聞樂見),chenzeyu97希望從一排妹子裏找出3隊連續的妹子,使她們的美麗度和最大。註意,一個妹子不能被編入多個隊伍而且一定要拿出三隊,不然czy會閑著沒事做~。
簡單滴說就是:
給定一個數列,從中找到3個無交集的連續子數列使其和最大。
【輸入文件】
第一行一個數n,表示數列長度。
接下來有n行,每行一個數,第i行為第i個數。
【輸出文件】
僅有一個數,表示最大和。
【樣例輸入】 jx.in
10
-1
2
3
-4
0
1
-6
-1
1
-2
【樣例輸出】 jx.out
7
【樣例說明】
第一隊妹子取2,3。
第二隊妹子取0,1。
第三隊妹子取1。
【數據範圍】
請大家放心,雖然chenzeyu97妹子無數,但是這次他叫來的個數n是有限的。=v=
對於30%的數據,妹子數不大於200。
對於60%的數據,妹子數不大於2000。
對於100%的數據,妹子數1000000。
而且,由於chenzeyu97沒有CCR那樣的影響力,所以他的妹子選完的最大美麗度和不超過maxlongint。(註:CCR隨便選就爆long long,因為他是把妹狂魔=V=)。
明顯的dp大體思路和std差不多
當時寫boom了
dp,dp[i][j][0]表示前i個中取j段的最大值,其中第i個被取到。f[i][j][1]表示前i個中取j段的最大值,其中第i個沒被取到。顯然max(f[n][3][0],f[n][3][1])即是所求。
轉移方程也很好寫,當前不取就從前一個取或不取中選最優。當前取,那前一個可以不取,也可以取。前一個取又分兩種,一是i跟i-1連在一起,二是i自成一個子序列。
#include<cstdio> #include<cstring> #include<iostream> using namespace std; int f[1000006][4][2],n,a[1000006]; int main() { freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",a+i); memset(f,128,sizeof(f)); for(int i=1;i<=n;i++) for(int j=1;j<=3;j++) { f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1]); f[i][j][1]=max(f[i-1][j-1][0]+a[i],f[i-1][j-1][1]+a[i]); f[i][j][1]=max(f[i][j][1],f[i-1][j][1]+a[i]); } printf("%d",max(f[n][3][0],f[n][3][1])); return 0; }
某種數列問題