51nod 1052 最大M子段和 dp

2021-08-25 14:52:48 字數 759 閱讀 1168

n個數,切為m段,最大和 n,m<=5e3

dp[i][j],使用前i個數(!!!第i個數被使用!!!),分為j段的最大和.

每到乙個點,他最大的這個dp狀態,要不是和前面乙個連著最大,要不就是不和前面乙個連著的最大.

#include 

#include

#include

#include

#ifdef noob

#define debug(x) std::cerr << #x << " = " << (x) << std::endl

#else

#define debug(...)

#endif

using

namespace

std;

typedef

long

long ll;

const

int maxn = 5e3 + 17;

const

int mod = 1000000007;

int a[maxn];

ll dp[2][maxn],mx[maxn];

int main()

ll ans = 0;

for (int i = 1; i <= m; ++i)

int now = 0,pre = 1;

for (int i = 1; i <= n; ++i)

}cout

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。刷刷水有益身心健康。不過我還是沒有一眼看出來。考慮...

51Nod1052 最大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。input 第1行 2個數n和m,中間用空格分隔。...

51Nod 1052 最大M子段和

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