Codeforces Round 128 Div. 2 E. Moving Chips
阿新 • • 發佈:2022-05-17
對於第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; }