codeforces 1391D 상압 dp

17048 단어 codeforcesDP
1391D 2000의 제목: nm의 매트릭스(n<=m)를 주고 0과 1만 포함한다. 당신은 이 매트릭스에 대해 조작을 할 수 있다. 0을 1로 바꾸거나 1을 0으로 바꾸면 이 매트릭스 임의의 xx내 1의 개수를 홀수로 만들 수 있다. 가장 적은 조작 횟수를 묻거나 안 되면 프린트-1 사고방식을 출력할 수 있다. 분명히 n>=4시에는 풀이가 없다. 4X4의 매트릭스는 네 개의 2X2 매트릭스로 바뀌기 때문에 만족할 수 없다.그 다음에 n=2와 n=3에 대한 분류 토론을 하고 상압 dp의 지식을 활용했다. 내 dp는 진짜 요리 코드는 다음과 같다.
#pragma GCC optimize("Ofast","inline","-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,mmx")
#include 
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
#define rep(i, a, n) for(int i = a; i <= n; i++)
#define per(i, a, n) for(int i = n; i >= a; i--)
#define IOS std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define fopen freopen("file.in","r",stdin);freopen("file.out","w",stdout);
#define fclose fclose(stdin);fclose(stdout);
const int inf = 1e9;
const ll onf = 1e18;
const int maxn = 1e6+10;
inline int read(){
	int x=0,f=1;char ch=getchar();
	while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
	while (isdigit(ch)){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}
	return x*f;
}
char s[maxn];
int a[4][maxn];
signed main(){
	int n = read(), m=read();
	if(n>=4){printf("-1
"
); return 0;} if(n==1){printf("0
"
); return 0;} rep(i,1,n){ scanf("%s", s+1); rep(j,1,m){ a[i][j] = s[j]-'0'; } } if(n==2){ int o = 0, e = 0; rep(i,1,m){ int tmp = a[1][i]+a[2][i]; if(i&1){ if(~tmp&1) o++; else e++; }else { if(tmp&1) o++; else e++; } } printf("%d
"
, min(o,e)); return 0; } int ans = inf; rep(i,0,3){ int tmp = 0; rep(j,1,m){ int c1 = (a[1][j]+a[2][j])&1; int c2 = (a[2][j]+a[3][j])&1; int t = c1<<1|c2; if(j&1){ if(i!=t) tmp++; }else{ if(i+t!=3) tmp++; } } ans = min(tmp, ans); } printf("%d
"
, ans); return 0; }

좋은 웹페이지 즐겨찾기