B - Maximum Subarrays Kattis - maximumsubarrays[動態規劃]
阿新 • • 發佈:2018-12-13
題意:給出一個數列,需要找出k個連續欄位,讓他們的和最大。
題解:動態規劃,首先可以假設
為加上第j個數字分成i段的最大值,然後存在轉移方程
然後我們發現狀態的轉移只需要當前狀態的前一步
已經一個上一個狀態的最大值
,所以並沒有必要開二維的陣列,所以我們需要開一個MAX陣列來記錄上一個狀態到達
點的時候前面所有dp的最大值用來轉移到當前狀態即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define met(a, b) memset(a, b, sizeof(a))
#define rep(i, a, b) for(int i = a; i <= b; i++)
#define per(i, a, b) for(int i = a; i >= b; i--)
#define MAXSIZE 10
#define DLEN 4
const int maxn = 1e5 + 10;
const int inf = 0x3f3f3f3f;
class Kattis_maximumsubarrays {
public:
Kattis_maximumsubarrays();
~Kattis_maximumsubarrays();
void input();
void init();
void solve();
private:
ll *dp, *MAX, *a;
int n, m;
};
int main() {
Kattis_maximumsubarrays * pro = new Kattis_maximumsubarrays();
pro -> solve();
delete pro;
pro = NULL;
return 0;
}
Kattis_maximumsubarrays::Kattis_maximumsubarrays() {
dp = new ll[maxn];
MAX = new ll[maxn];
a = new ll[maxn];
}
Kattis_maximumsubarrays::~Kattis_maximumsubarrays() {
delete []dp;
delete []MAX;
delete []a;
dp = NULL;
MAX = NULL;
a = NULL;
}
void Kattis_maximumsubarrays::input() {
scanf("%d%d", &n, &m);
rep(i, 1, n) {
scanf("%lld", &a[i]);
}
}
void Kattis_maximumsubarrays::init() {
for(int i = 0; i < maxn;i ++) dp[i] = MAX[i] = 0;
}
void Kattis_maximumsubarrays::solve() {
init();
input();
ll ans = -1e18;
rep(i, 1, m) {
ans = -1e18;
rep(j, i, n) {
dp[j] = max(dp[j - 1] + a[j], MAX[j - 1] + a[j]);
MAX[j - 1] = ans;
ans = max(ans, dp[j]);
}
}
printf("%lld\n", ans);
}