rt,第二篇题解的状压思路,WA3,只过了样例/kk
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5;
const int inf = 0x3f3f3f3f;
int n, m, a[10][N], dp[N][10];
int cge(int x, int y) {
return ((x >> y) & 1);
}
int change(int x, int y) {
return (cge(x, 0) ^ a[1][y]) + (cge(x, 1) ^ a[2][y]) + (cge(x, 2) ^ a[3][y]);
}
bool check(int x, int y) {
if(!(cge(x, 2) ^ cge(y, 2) ^ cge(x, 1) ^ cge(y, 1)) || !(cge(x, 1) ^ cge(y, 1) ^ cge(x, 0) ^ cge(y, 0))) return false;
return true;
}
int main() {
cin >> n >> m;
if(n >= 4) puts("-1");
if(n == 1) puts("0");
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
char ch;
scanf(" %c", &ch);
a[i][j] = (ch ^ 48);
}
if(n == 2) {
int cnt1 = 0, cnt2 = 0, now = (a[1][2] ^ a[2][2]);
if(!(a[1][1] ^ a[1][2] ^ a[2][1] ^ a[2][2])) ++cnt1, ++cnt2, now ^= 1;
for(int i = 3; i <= m; i++) {
if(!(now ^ a[1][i] ^ a[2][i])) ++cnt1, now = (a[1][i] ^ a[2][i] ^ 1);
else now = (a[1][i] ^ a[2][i]);
}
now = (a[1][2] ^ a[2][2]);
for(int i = 3; i <= m; i++) {
if(!(now ^ a[1][i] ^ a[2][i])) ++cnt2, now = (a[1][i] ^ a[2][i] ^ 1);
else now = (a[1][i] ^ a[2][i]);
}
printf("%d\n", min(cnt1, cnt2));
}
else if(n == 3) {
int mn = inf;
for(int i = 0; i < 8; i++) dp[1][i] = change(1, i);
for(int i = 2; i <= m; i++) {
for(int j = 0; j < 8; j++) {
dp[i][j] = inf;
for(int k = 0; k < 8; k++)
if(check(j, k))
dp[i][j] = min(dp[i][j], dp[i - 1][k] + change(i, j));
}
}
for(int i = 0; i < 8; i++) mn = min(mn, dp[m][i]);
printf("%d\n", mn);
}
return 0;
}