版权声明:有错误欢迎大家指出。转载请注明出处~ https://blog.csdn.net/black_miracle/article/details/86505879
传送门:http://codeforces.com/contest/1099/problem/E
题意:给你一个只包含AGCT的矩阵,让你用AGCT替换掉一些字符,使得每个2*2的子矩阵都包含AGCT,求替换掉最少字符的那个矩阵。
题解:经过手动模拟发现,符合题意的矩阵,要么每行只有两种字符交替出现且与相邻行的字符不同,要么每列是上述这样,所以我们只要按行按列枚举,然后对于每行求出最优方案即可。
#include<bits/stdc++.h>
#define fuck(x) cout<<#x<<' '<<x<<endl
using namespace std;
string a[300005],b="AGCT";
int main(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)cin>>a[i];
string ans;
int tp=1e9;
for(auto c:b){
for(auto d:b){
if(c==d)continue;
for(auto e:b){
if(e==c||e==d)continue;
for(auto f:b){
if(f==c||f==d||f==e)continue;
int now=0;
for(int i=0;i<n;i++){
if(!(i&1)){
int mi=0,t=0;
for(int j=0;j<m;j+=2){
if(a[i][j]!=c)mi++;
if(a[i][j]!=d)t++;
}
for(int j=1;j<m;j+=2){
if(a[i][j]!=d)mi++;
if(a[i][j]!=c)t++;
}
now+=min(t,mi);
}
else{
int mi=0,t=0;
for(int j=0;j<m;j+=2){
if(a[i][j]!=e)mi++;
if(a[i][j]!=f)t++;
}
for(int j=1;j<m;j+=2){
if(a[i][j]!=f)mi++;
if(a[i][j]!=e)t++;
}
now+=min(t,mi);
}
}
if(tp>now){
ans="";
ans+=c;
ans+=d;
ans+=e;
ans+=f;
tp=now;
}
}
}
}
}
string ans2;
int tp2=1e9;
for(auto c:b){
for(auto d:b){
if(c==d)continue;
for(auto e:b){
if(e==c||e==d)continue;
for(auto f:b){
if(f==c||f==d||f==e)continue;
int now=0;
for(int i=0;i<m;i++){
if(!(i&1)){
int mi=0,t=0;
for(int j=0;j<n;j+=2){
if(a[j][i]!=c)mi++;
if(a[j][i]!=d)t++;
}
for(int j=1;j<n;j+=2){
if(a[j][i]!=d)mi++;
if(a[j][i]!=c)t++;
}
now+=min(t,mi);
}
else{
int mi=0,t=0;
for(int j=0;j<n;j+=2){
if(a[j][i]!=e)mi++;
if(a[j][i]!=f)t++;
}
for(int j=1;j<n;j+=2){
if(a[j][i]!=f)mi++;
if(a[j][i]!=e)t++;
}
now+=min(t,mi);
}
}
if(tp2>now){
ans2="";
ans2+=c;
ans2+=d;
ans2+=e;
ans2+=f;
tp2=now;
}
}
}
}
}
// fuck(ans2);
if(tp<tp2){
for(int i=0;i<n;i++){
if(!(i&1)){
int a1=0,a2=0;
for(int j=0;j<m;j+=2){
if(a[i][j]!=ans[0])a1++;
if(a[i][j]!=ans[1])a2++;
}
for(int j=1;j<m;j+=2){
if(a[i][j]!=ans[1])a1++;
if(a[i][j]!=ans[0])a2++;
}
if(a1<a2){
for(int j=0;j<m;j++){
if(j&1)printf("%c",ans[1]);
else printf("%c",ans[0]);
}
printf("\n");
}
else{
for(int j=0;j<m;j++){
if(j&1)printf("%c",ans[0]);
else printf("%c",ans[1]);
}
printf("\n");
}
}
else{
int a1=0,a2=0;
for(int j=0;j<m;j+=2){
if(a[i][j]!=ans[2])a1++;
if(a[i][j]!=ans[3])a2++;
}
for(int j=1;j<m;j+=2){
if(a[i][j]!=ans[3])a1++;
if(a[i][j]!=ans[2])a2++;
}
if(a1<a2){
for(int j=0;j<m;j++){
if(j&1)printf("%c",ans[3]);
else printf("%c",ans[2]);
}
printf("\n");
}
else{
for(int j=0;j<m;j++){
if(j&1)printf("%c",ans[2]);
else printf("%c",ans[3]);
}
printf("\n");
}
}
}
}
else{
for(int i=0;i<m;i++){
if(!(i&1)){
int a1=0,a2=0;
for(int j=0;j<n;j+=2){
if(a[j][i]!=ans2[0])a1++;
if(a[j][i]!=ans2[1])a2++;
}
for(int j=1;j<n;j+=2){
if(a[j][i]!=ans2[1])a1++;
if(a[j][i]!=ans2[0])a2++;
}
if(a1<a2){
for(int j=0;j<n;j++){
if(j&1)a[j][i]=ans2[1];
else a[j][i]=ans2[0];
}
}
else{
for(int j=0;j<n;j++){
if(j&1)a[j][i]=ans2[0];
else a[j][i]=ans2[1];
}
}
}
else{
int a1=0,a2=0;
for(int j=0;j<n;j+=2){
if(a[j][i]!=ans2[2])a1++;
if(a[j][i]!=ans2[3])a2++;
}
for(int j=1;j<n;j+=2){
if(a[j][i]!=ans2[3])a1++;
if(a[j][i]!=ans2[2])a2++;
}
if(a1<a2){
for(int j=0;j<n;j++){
if(j&1)a[j][i]=ans2[3];
else a[j][i]=ans2[2];
}
}
else{
for(int j=0;j<n;j++){
if(j&1)a[j][i]=ans2[2];
else a[j][i]=ans2[3];
}
}
}
}
for(int i=0;i<n;i++)cout<<a[i]<<endl;
}
return 0;
}