BOJ 7976 - 수열
이문제는 어려워서 해설을 봤다.
에 대해 모두 으로 Parity만 남기자.
가 되야 한다는 점을 관찰한다.
의 합은 일정한데 가 되야 하기 때문이다.
또한 구간의 합이 짝수가 되야 한다.
의 인덱스들이 Parity가 가 되도록 하는 변경 최소 횟수라고 정의한다.
정답은 이다.
를 번 째 인덱스들에서 Parity가 인 것의 개수라고 하면 점화식은 다음과 같다.
왜 가 반대냐면 모두 로 만들어주기 위해는 의 개수만큼 을 변경해줘야 하기 때문이다.
void solve() {
int n, k;
cin >> n >> k;
vi a(n);
fv(a);
for (int &i: a)i %= 2;
int s = 0;
vvi dp(k, vi(2, 1e9));
for (int i = 0; i < k; i++) {
int sum = 0, cnt = 0;
for (int j = i; j < n; j += k) cnt++, sum += a[j];
int to_zero = sum;
int to_one = cnt - sum;
if (i == 0) {
dp[i][0] = to_zero;
dp[i][1] = to_one;
} else {
dp[i][0] = min(dp[i - 1][0] + to_zero, dp[i - 1][1] + to_one);
dp[i][1] = min(dp[i - 1][0] + to_one, dp[i - 1][1] + to_zero);
}
}
cout << dp[k - 1][0];
}
Comments