halang-log
💡 PS

[BOJ] 16512 Maximum Subarrays

date
Mar 17, 2022
slug
boj-16512
author
status
Public
tags
PS
summary
Maximum Subarrays문제에 대한 풀이입니다.
type
Post
thumbnail
category
💡 PS
updatedAt
Aug 3, 2023 09:14 AM
언어

문제

풀이

cnt가 증가할 때 : 그룹이 생성된다. (cnt+1) + v[ix] 이면 v[ix]cnt+1그룹의 마지막 원소인 것.
flag가 1일 때 : 그룹이 첫번째 원소가 정해지지 않은 상태. go(ix + 1, cnt, 0) + v[ix]v[ix]cnt+1그룹의 첫번째 원소. go(ix + 1, cnt + 1, 1) + v[ix]v[ix]가 그룹의 첫번째 원소이자 마지막 원소
flag가 0일 때 : 그룹의 첫번째 원소가 정해진 상태. go(ix + 1, cnt, 0) + v[ix]v[ix]가 해당 그룹에 추가된 상태, go(ix + 1, cnt + 1, 1) + v[ix]v[ix]가 해당 그룹에 추가되며 마지막 원소인 상태
ixn일 때 flag가 0일 경우, 그룹의 마지막 원소가 정해지지 않았으므로 cnt를 하나 증가시켜준다.

코드

#include <cstdio> #include <cstring> #include <algorithm> #include <queue> typedef long long ll; using namespace std; int n, m; vector<int> v; ll dp[5000][5000][2]; ll go(int ix, int cnt, int flag) { if (ix == n) { if (flag == 0) cnt++; if (cnt == m) return 0; return -1e18; } if (dp[ix][cnt][flag] != -1) return dp[ix][cnt][flag]; ll ret; if (flag) { ret = max(go(ix + 1, cnt, 1), go(ix + 1, cnt, 0) + v[ix]); ret = max(ret, go(ix + 1, cnt + 1, 1) + v[ix]); } else { ret = max(go(ix + 1, cnt, 0) + v[ix], go(ix + 1, cnt + 1, 1) + v[ix]); } return dp[ix][cnt][flag] = ret; } int main() { scanf("%d %d", &n, &m); memset(dp, -1, sizeof(dp)); ll a; for(int i = 0; i < n; i++) { scanf("%lld", &a); v.push_back(a); } printf("%lld", go(0, 0, 1)); }