1. 程式人生 > 其它 >Codeforces Round 128 Div. 2 E. Moving Chips

Codeforces Round 128 Div. 2 E. Moving Chips

對於第i(1<=i<=n)列為最終狀態,分為3種情況
f[0][i]表示這列的沒有'*'
f[1][i]表示這列有且僅有第一行有'*'
f[2][i]表示這列有且僅有第二行有'*'
#include<bits/stdc++.h>
using namespace std;

const int N = 2e5+10,INF = 0x3f3f3f3f;

char g[2][N];
int f[3][N];

int main(){
	int test;
	cin>>test;
	while(test--){
		int n;
		cin>>n>>g[0]+1>>g[1]+1;
		for(int i=n;i>=0;i--){
			if(g[0][i]=='*' || g[1][i]=='*'){
				n=i;
				break;
			}
		}
		memset(f,0x3f,sizeof f);
		f[0][0]=0;
		for(int i=1;i<=n;i++){
			if(g[0][i]!='*' && g[1][i]!='*'){
				f[0][i]=f[0][i-1];
				f[1][i]=min(f[1][i-1]+1,f[2][i-1]+2);
				f[2][i]=min(f[1][i-1]+2,f[2][i-1]+1);
			}
			else if(g[0][i]=='*' && g[1][i]!='*'){
				f[1][i]=min({f[0][i-1],f[1][i-1]+1,f[2][i-1]+2});
				f[2][i]=min({f[0][i-1]+1,f[1][i-1]+2,f[2][i-1]+2});
			}
			else if(g[0][i]!='*' && g[1][i]=='*'){
				f[1][i]=min({f[0][i-1]+1,f[1][i-1]+2,f[2][i-1]+2});
				f[2][i]=min({f[0][i-1],f[1][i-1]+2,f[2][i-1]+1});
			}
			else{
				f[1][i]=min({f[0][i-1]+1,f[1][i-1]+2,f[2][i-1]+2});
				f[2][i]=min({f[0][i-1]+1,f[1][i-1]+2,f[2][i-1]+2});
			}
		}
		cout<<min(f[1][n],f[2][n])<<endl;
	}	
	return 0;
}