51Nod1052 最大M子段和

2021-08-04 14:42:56 字數 1010 閱讀 8215

n個整數組成的序列a[1],a[2],a[3],…,a[n],將這n個數劃分為互不相交的m個子段,並且這m個子段的和是最大的。如果m >= n個數中正數的個數,那麼輸出所有正數的和。

例如:-2 11 -4 13 -5 6 -2,分為2段,11 -4 13一段,6一段,和為26。

input

第1行:2個數n和m,中間用空格分隔。n為整數的個數,m為劃分為多少段。(2 <= n , m <= 5000)

第2 - n+1行:n個整數 (-10^9 <= a[i] <= 10^9)

output

輸出這個最大和

input示例

7 2

-2 11

-4 13

-5 6

-2 output示例

26題解

f[i][j]表示前j段,使用前i個數字的最大值,一定要使用第i個值

g[i][j]表示前j段,使用前i個數字的最大值

f[i][j]=max(g[i - 1][j - 1] + x,f[i-1][j] + x)

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

**

#include

#define n 500005

#define ll long long

#define inf 100000000

#define mod 100000000

using

namespace

std;

inline

int read()

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

return x*f;

}ll f[2][5005],g[2][5005];

int n,m;

int main()

}cout

<1][m];

return

0;}

51Nod 1052 最大M子段和

n個整數組成的序列a 1 a 2 a 3 a n 將這n個數劃分為互不相交的m個子段,並且這m個子段的和是最大的。如果m n個數中正數的個數,那麼輸出所有正數的和。例如 2 11 4 13 5 6 2,分為2段,11 4 13一段,6一段,和為26。刷刷水有益身心健康。不過我還是沒有一眼看出來。考慮...

51Nod 1052 最大M子段和

先將同符號的每一段存下來,並記錄前後段標號,將正數段總和記錄為tot 開乙個最小堆存每一段的abs值。每次從堆中取出乙個x 去掉這一段,並將左右的段與之合併再存入堆中,作為撤銷或更改操作。每次操作都會減少一段,直到段數 k就退出。include include include include def...

51nod 1052 最大M子段和

1052 最大m子段和 基準時間限制 2 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 n個整數組成的序列a 1 a 2 a 3 a n 將這n個數劃分為 互不相交的m個子段,並且這m個子段的和是最大的。如果m n個數中正數的個數,那麼輸出所有正數的和。例如 2 11 4 13 ...