题目
解题思路
不考虑顺序的话,最优解是唯一的。
我们首先观察点(1,n),只会被一个点对影响,处理完它后(2,n)和(1,n-1)都只被一个点对影响。
当一个点只被一个点对影响时,我们很容易的知道这个点对选和不选了。
复杂度
O
(
n
2
)
O(n^2)
O(n2)。
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int N = 2e3 + 100;
int n, ans = 0;
int sa[N][N], col[N], row[N];
char str[N];
int main() {
//freopen("0.txt", "r", stdin);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%s", str + 1);
for (int j = 1; j <= n; j++) sa[i][j] = str[j] - '0';
}
for (int i = 1; i <= n; i++) {
for (int j = n; j > i; j--) {
sa[i][j] ^= col[i] ^ row[j];
if (sa[i][j]) {
ans++;
col[i] ^= 1;
row[j] ^= 1;
}
}
}
for (int i = 1; i <= n; i++) {
sa[i][i] ^= col[i] ^ row[i];
col[i] = row[i] = 0;
}
for (int i = n; i >= 1; i--) {
for (int j = 1; j < i; j++) {
sa[i][j] ^= col[i] ^ row[j];
if (sa[i][j]) {
ans++;
col[i] ^= 1;
row[j] ^= 1;
}
}
}
for (int i = 1; i <= n; i++) if (sa[i][i] ^ col[i] ^ row[i]) ans++;
printf("%d\n", ans);
return 0;
}