思路:
dp+记忆化搜索
状态:dp[i][j]表示选取第一堆前i个和第二堆前j的状态:0:0多1个 1:0和1相等 2:1多一个 -2:不能达到题目所描述的状态
初始状态:dp[0][0]=1
状态转移:见代码
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_bck #define mem(a,b) memset(a,b,sizeof(a)) const int N=1e3+5; int n1[N],n2[N]; int dp[N][N];//0:0more 1:equal 2:1more int ans[N*2]; int dfs(int x,int y){ if(~dp[x][y])return dp[x][y]; if(x==0&&y==0)return dp[x][y]=1; if(x!=0){ int t=dfs(x-1,y); if(t==0){ if(n1[x]==1){ ans[x+y]=1; return dp[x][y]=1; } } else if(t==1){ if(n1[x]==1){ ans[x+y]=1; return dp[x][y]=2; } else if(n1[x]==0){ ans[x+y]=1; return dp[x][y]=0; } } else if(t==2){ if(n1[x]==0){ ans[x+y]=1; return dp[x][y]=1; } } } if(y!=0){ int t=dfs(x,y-1); if(t==0){ if(n2[y]==1){ ans[x+y]=2; return dp[x][y]=1; } } else if(t==1){ if(n2[y]==1){ ans[x+y]=2; return dp[x][y]=2; } else if(n2[y]==0){ ans[x+y]=2; return dp[x][y]=0; } } else if(t==2){ if(n2[y]==0){ ans[x+y]=2; return dp[x][y]=1; } } } return dp[x][y]=-2; } int main(){ ios::sync_with_stdio(false); cin.tie(0); int n; string a[3]; cin>>n; cin>>a[1]>>a[2]; for(int i=1;i<=n;i++)n1[i]=a[1][i-1]-‘0‘; for(int i=1;i<=n;i++)n2[i]=a[2][i-1]-‘0‘; mem(dp,-1); if(dfs(n,n)!=-2){ for(int i=1;i<=2*n;i++)cout<<ans[i]; cout<<endl; }else cout<<"Impossible"<<endl; return 0; }