이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#define nl '\n'
const int mxN = 1e4 + 5, mxK = 205;
int A[mxN];
int64_t pref[mxN];
int way[mxN][mxK];
int N, K;
signed main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin >> N >> K;
for (int i = 1; i <= N; i++) {
std::cin >> A[i];
pref[i] = pref[i - 1] + A[i];
}
std::vector<int64_t> dp(N + 1, -1e18);
std::vector<int64_t> ndp(N + 1, -1e18);
dp[0] = 0;
for (int j = 1; j <= K + 1; j++) {
ndp[0] = -1e18;
for (int i = 1; i <= N; i++) {
ndp[i] = -1e18;
for (int k = i - 1; k >= 0; k--) {
auto cand = dp[k] + (pref[i] - pref[k]) * pref[k];
if (ndp[i] < cand) {
ndp[i] = cand;
way[i][j] = k;
}
}
}
std::swap(dp, ndp);
}
std::cout << dp[N] << nl;
std::vector<int> ans;
int x = N;
int y = K + 1;
while (x > 0 && y > 1) {
ans.push_back(way[x][y]);
x = way[x][y];
y--;
}
for (int i : ans) std::cout << i << " ";
std::cout << nl;
}
/*
7 3
4 1 3 4 0 2 3
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |