# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1187965 | versesrev | 수열 (APIO14_sequence) | C++20 | 0 ms | 0 KiB |
#include <iostream>
#include <vector>
#include <limits>
#include <numeric>
int main() {
int n, k;
std::cin >> n >> k;
std::vector<int> xs(n);
for (int& x : xs) std::cin >> x;
std::vector<long long> sum(n);
std::partial_sum(xs.begin(), xs.end(), sum.begin());
long long INF = std::numeric_limit<long long>::max();
std::vector<std::vector<long long>> dp(k+1, std::vector<long long>(n));
std::vector<std::vector<int>> back(k+1, std::vector<int>(n, -1));
//dp[0].assign(n, INF), dp[1].assign(n, INF);
for (int i = 0; i < n; ++i) {
dp[0][i] = sum[i] * sum[i];
back[0][i] = -1;
}
for (int ik = 1; ik <= k; ++ik) {
for (int i = 0; i < n; ++i) {
for (int j = ik; j <= i; ++j) {
long long v = dp[ik-1][j-1] +
(sum[i] - sum[j-1]) *
(sum[i] - sum[j-1])
);
if (dp[ik][i] > v) {
dp[ik][i] = v;
back[ik][i] = j - 1;
}
}
}
}
std::vector<int> ans;
for (int p = n - 1, ik = k; ik; --ik) {
p = back[ik][p];
ans.push_back(p + 1);
}
std::ranges::reverse(ans);
for (int v : ans) std::cout << v << " ";
std::cout << "\n";
}