我这里哪错了,感觉我暴力转移没问题啊
查看原帖
我这里哪错了,感觉我暴力转移没问题啊
531811
luoguo0921楼主2024/7/14 15:13
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10,M=1e4+10,inf=1e9+10;
int f[N][2][3],T,n,ans;//0被0覆盖1被1覆盖int ans=1<<62; 
char a[N],b[N];
int main(){
	cin>>T;
	while(T--){
		cin>>b>>a;
		ans=inf;
		n=0;
		while(a[n]!=0){
			n++;
		}
		memset(f,62,sizeof(f));
		if(a[0]==b[0]){
			f[0][0][2]=0;
			if(a[0]=='0')
			f[0][1][1]=2;
			else
			f[0][1][0]=2;
		}
		else
		{
		f[0][1][0]=1;
			if(a[0]='0')
			{
				f[0][1][1]=2;
				f[0][0][0]=1;
			}
			else{
				f[0][1][0]=2;
				f[0][0][1]=1;
			}
		}
		for(int i=1;i<n;i++){
			if(a[i]==b[i]){
			for(int j=0;j<2;j++)
						for(int k=0;k<3;k++)
						f[i][0][2]=min(f[i-1][j][k],f[i][0][2]);
				if(a[i]=='1'){
						f[i][1][0]=min(f[i][1][0],f[i-1][0][0]+1);
						f[i][1][0]=min(f[i][1][0],f[i-1][0][1]+2);
						f[i][1][0]=min(f[i][1][0],f[i-1][0][2]+2);
						f[i][1][0]=min(f[i][1][0],f[i-1][1][0]);
						f[i][1][0]=min(f[i][1][0],f[i-1][1][1]+1);
						f[i][1][0]=min(f[i][1][0],f[i-1][1][2]+1);
				}
				if(a[i]=='0'){
					f[i][1][1]=min(f[i][1][1],f[i-1][0][0]+2);
						f[i][1][1]=min(f[i][1][1],f[i-1][0][1]+1);
						f[i][1][1]=min(f[i][1][1],f[i-1][0][2]+2);
						f[i][1][1]=min(f[i][1][1],f[i-1][1][0]+1);
						f[i][1][1]=min(f[i][1][1],f[i-1][1][1]);
						f[i][1][1]=min(f[i][1][1],f[i-1][1][2]+1);
				}
			}
			else{
				if(a[i]=='1'){
					f[i][1][2]=min(f[i][1][2],f[i-1][0][0]+1);
						f[i][1][2]=min(f[i][1][2],f[i-1][0][1]+1);
						f[i][1][2]=min(f[i][1][2],f[i-1][0][2]+1);
						f[i][1][2]=min(f[i][1][2],f[i-1][1][0]);
						f[i][1][2]=min(f[i][1][2],f[i-1][1][1]);
						f[i][1][2]=min(f[i][1][2],f[i-1][1][2]);
						
						f[i][1][0]=min(f[i][1][0],f[i-1][0][0]+1);
						f[i][1][0]=min(f[i][1][0],f[i-1][0][1]+2);
						f[i][1][0]=min(f[i][1][0],f[i-1][0][2]+2);
						f[i][1][0]=min(f[i][1][0],f[i-1][1][0]);
						f[i][1][0]=min(f[i][1][0],f[i-1][1][1]+1);
						f[i][1][0]=min(f[i][1][0],f[i-1][1][2]+1);
						
						f[i][0][1]=min(f[i][0][1],f[i-1][0][0]+1);
						f[i][0][1]=min(f[i][0][1],f[i-1][0][1]);
						f[i][0][1]=min(f[i][0][1],f[i-1][0][2]+1);
						f[i][0][1]=min(f[i][0][1],f[i-1][1][0]+1);
						f[i][0][1]=min(f[i][0][1],f[i-1][1][1]);
						f[i][0][1]=min(f[i][0][1],f[i-1][1][2]+1);
				}
				if(a[i]=='0'){
					f[i][1][2]=min(f[i][1][2],f[i-1][0][0]+1);
						f[i][1][2]=min(f[i][1][2],f[i-1][0][1]+1);
						f[i][1][2]=min(f[i][1][2],f[i-1][0][2]+1);
						f[i][1][2]=min(f[i][1][2],f[i-1][1][0]);
						f[i][1][2]=min(f[i][1][2],f[i-1][1][1]);
						f[i][1][2]=min(f[i][1][2],f[i-1][1][2]);
						
						f[i][1][1]=min(f[i][1][1],f[i-1][0][0]+2);
						f[i][1][1]=min(f[i][1][1],f[i-1][0][1]+1);
						f[i][1][1]=min(f[i][1][1],f[i-1][0][2]+2);
						f[i][1][1]=min(f[i][1][1],f[i-1][1][0]+1);
						f[i][1][1]=min(f[i][1][1],f[i-1][1][1]);
						f[i][1][1]=min(f[i][1][1],f[i-1][1][2]+1);
						
						f[i][0][0]=min(f[i][0][0],f[i-1][0][0]);
						f[i][0][0]=min(f[i][0][0],f[i-1][0][1]+1);
						f[i][0][0]=min(f[i][0][0],f[i-1][0][2]+1);
						f[i][0][0]=min(f[i][0][0],f[i-1][1][0]);
						f[i][0][0]=min(f[i][0][0],f[i-1][1][1]+1);
						f[i][0][0]=min(f[i][0][0],f[i-1][1][2]+1);
				}
			}
		}
		for(int i=0;i<2;i++){
			for(int j=0;j<3;j++)
			ans=min(ans,f[n-1][i][j]);
		} 
		cout<<ans<<endl;
	}
}
2024/7/14 15:13
加载中...