首先显而易见的是,n必须是3的倍数,否则无法构成
其次,将矩阵按照每三个分割,然后枚举这些块,每个分割好的块都有6种修改方案,我们可以枚举所有的方案
对于每个枚举的方案,我们可以计算出原来的块修改成该方案需要多少步
然后关键的来了,假设修改后该块第一层第一个字符为 和第二层第一个字符为
,我们只能接前面一个块第一层最后一个字符为
和第二层最后一个字符为
(也就是翻转)的方案
#include <bits/stdc++.h>
#define int long long
using namespace std;
signed main() {
ios::sync_with_stdio(0),cin.tie(0);
int n;
cin>>n;
string s[2];
cin>>s[0]>>s[1];
s[0]=" "+s[0];
s[1]=" "+s[1];
if(n%3!=0){
cout<<-1<<endl;
return 0;
}
string ans[6][2]={{"000","111"},{"111","000"},{"001","011"},{"110","100"},{"011","001"},{"100","110"}};//修改方案
int qian[6][2]={{0,1},{1,0},{0,0},{1,1},{0,0},{1,1}};//每个方案第一行第一个是什么,第二行第一个是什么
int hou[6][2]={{0,1},{1,0},{1,1},{0,0},{1,1},{0,0}};//每个方案第一行最后一个是什么,第二行最后一个是什么
vector<vector<int>> dp(n+1, vector<int>(4,LLONG_MAX));//修改完1到i时,s[i]的情况为j(j=s[i][0]*2+s[i][1])时,最小方案数为多少
dp[0][0]=dp[0][1]=dp[0][2]=dp[0][3]=0;
for(int i=1;i<=n;i+=3){//每三个三个枚举
for(int j=0;j<6;j++){//枚举方案
int ned=0;
for(int k=0;k<3;k++){//按照j方案修改
if(s[0][i+k]!=ans[j][0][k])ned++;
if(s[1][i+k]!=ans[j][1][k])ned++;
}
int id=hou[j][0]*2+hou[j][1];
//假设该方案第一行第一个为0(1),第二行第一个为1(0)
//那么只能接上一个方案第一行最后一个为1(0),第二行最后一个为0(1)的方案(也就是翻转的方案)
int qid=(qian[j][0]^1)*2 + (qian[j][1]^1);
dp[i+2][id]=min(dp[i+2][id], dp[i-1][qid] + ned);
}
}
int wc=min(min(dp[n][0],dp[n][1]),min(dp[n][2],dp[n][3]));
if(wc==LLONG_MAX)cout<<-1;//没有方案(虽然不太可能)
else cout<<wc;
return 0;
}
/*
⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣤⣤⣤⣤⣤⣤⣤⡀⠀⠀⠀⣾⡟⣻⣿⠇⠀⠀⠀⣠⣶⣶⣶⣶⣶⣤⣤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⣠⡶⢾⣿⣿⣿⣿⣿⣿⣿⣿⣧⣤⣴⣶⡿⣿⡿⠷⢶⣶⣤⣤⣿⣿⣿⣿⣿⣿⣿⣿⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢰⡿⠁⠀⠀⠀⠉⢉⣩⣽⡿⠟⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠛⠿⣿⣿⣿⣿⣿⣿⣄⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⣠⣶⠿⣿⠇⠀⠀⠀⣠⣴⠿⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⢷⣦⡉⠙⠛⠿⣶⣄⠀⠀⠀⠀⠀⠀
⠀⠀⢠⣿⠁⢸⡟⠀⠀⢠⣾⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⢻⣦⡀⠀⠀⢻⡇⠀⠀⠀⠀⠀
⠀⠀⢸⡏⠀⢸⡇⠀⣰⡿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠀⣠⡀⠀⠀⠀⠘⢿⣆⠀⢸⣇⠀⠀⠀⠀⠀
⠀⠀⣿⡇⠀⢸⣷⣼⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⡄⠀⠀⠀⠀⠀⠀⣿⢿⣆⠀⣿⣧⡄⠀⠀⠀⠈⢻⣧⣿⣿⡇⠀⠀⠀⠀
⠀⠀⣿⡇⠀⠀⣿⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡾⠋⢻⣆⠀⠀⠀⠀⢰⡏⠀⠙⢷⣌⡉⠀⠀⡀⠀⠀⠀⢻⣿⢸⡇⠀⠀⠀⠀
⠀⢀⣿⢀⣤⣶⠟⠁⠀⠀⠀⠀⠀⠀⢰⡆⠀⠀⣠⣾⠏⠁⠀⠀⠙⢷⣦⣀⣴⠟⠀⠀⠀⠀⠙⠻⣦⣌⣿⠀⠀⠀⢨⣿⢸⡧⠀⠀⠀⠀
⠀⢸⣿⠈⠻⢷⡆⠀⠀⠀⠀⠀⠀⢀⣿⣣⣴⡾⠋⠀⣀⣤⡀⠀⠀⠀⠈⠙⠁⠀⠀⣤⣤⣀⠀⠀⠀⠙⣿⠂⠀⠀⢸⣯⢸⣿⠀⠀⠀⠀
⠀⣸⡇⠀⠀⢺⡇⠀⠀⠀⠀⠀⠀⢸⡏⠉⠁⣠⣴⣾⣿⠟⠃⠀⠀⣾⣿⠟⠀⠀⠀⠈⠻⣿⣷⣦⡀⠀⣿⢀⣀⠀⣸⡟⢸⣿⠀⠀⠀⠀
⠀⣿⡇⠀⠀⠸⣧⠀⣷⡀⠀⠀⠀⢸⣧⠀⠾⠿⠛⠉⠀⠀⠀⠀⢠⣿⣿⠃⠀⠀⠀⠀⠀⠀⠙⠿⠇⠘⣿⡟⠋⣠⡿⠁⢸⣿⠀⠀⠀⠀
⠀⣿⠁⠀⠀⠀⠻⣧⡸⣷⡀⠀⢀⣀⢻⣆⠀⠀⠀⠀⠀⠀⠀⠀⠘⠿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣡⣶⠟⠁⠀⢸⣿⠀⠀⠀⠀
⢸⡿⠀⠀⠀⠀⠀⠙⢿⣾⣷⣆⠈⠛⣿⡟⠀⣇⠀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣴⡟⠋⠿⠛⠁⠀⠀⠀⠸⣿⠀⠀⠀⠀
⢸⡇⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⢿⣶⣾⡧⠀⠙⠚⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⠀⠀⠀
⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣧⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀
⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡀⠀⠈⣿⡄⠀⠀⠀⠀⠀⠀⠀⢹⣧⠀⠀⠀
⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣿⠇⠀⠀⠀⠀⠀⣦⠀⠀⠀⠀⢠⣶⠀⠀⣶⡄⠀⠀⠀⣸⡿⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⣿⡄⠀⠀
⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⡟⠀⠀⠀⠀⠀⠀⢿⣧⡀⠀⢀⣼⡟⠀⠀⠘⠿⣶⣤⣶⠟⠁⠀⠀⢸⣷⠀⠀⠀⠀⠀⠀⠀⠀⠹⣷⠀⠀
⠁⠀⠀⠀⠀⠀⠀⠀⠀⢠⣿⠃⠀⠀⠀⠀⠀⠀⠀⠙⠻⠿⠟⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡀⠀⠀⠀⠀⠀⠀⠀⠀⢿⣆⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡀
*/

京公网安备 11010502036488号