萌新,状压,求助
  • 板块CF1391D 505
  • 楼主EggShell123
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/8/30 10:23
  • 上次更新2023/11/5 13:58:54
查看原帖
萌新,状压,求助
373327
EggShell123楼主2020/8/30 10:23

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;
}
2020/8/30 10:23
加载中...