1052 最大M子段和 (dp)

2021-08-27 05:14:41 字數 1056 閱讀 8892

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

-2output示例

26思路:和最大子段和是有相似之處的。 設 d

p[i]

[j] dp[

i][j

]:把1到j的數字分成i段且最後乙個陣列下標j也包含在這子段裡時的最大值。 an

s[i]

[j] ans

[i][

j]

把1到j的數字分成i段的最大值

實際處理可以把第一位忽略。

#include

#include

#include

#include

#include

#define maxx 5005

#define ll long long

#define inf 0x3f3f3f3f3f3f3f3f

using

namespace

std;

ll dp[maxx];

ll ans[maxx];

int a[maxx];

int main()

ans[n]=temp;

}cout

0;}

1052 最大M子段和 DP

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 5...

51nod 1052 最大M子段和 DP

題目傳送門 好吧,好像是我zz了,原來連續的一段數可以當做許多段數來看的 突然掀桌,氣得我都變成簡筆畫了!害得我wa了6發!其實這題就是一道非常水的dp題,定義f i j 0 1 表示前 i 個數選了 j段,第三維表示當前的數是否被選在第 j 段數內。然後直接進行狀態轉移就行了。突然發現這樣開陣列會...

51Nod 1052 最大M子段和 DP

第一眼dp 第二眼隔板法 第三眼。嗯?第二眼好像看偏了?重新看第二眼 二維dp 所以說這道題是看兩眼就可以看出來做法的比較裸的dp題 wa了一發以後又重新看了一眼題面 嗯,要開long long 所以說這道題是看三眼就可以ac的比較裸的dp題 做完後倒回來看一眼自己的程式 嗯,只用到前面的一維 陣列...