E. Moving Chips
dp
预处理:求
m
i
n
min
min 所以初始化要
I
N
F
INF
INF
状态:
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j] 中
i
i
i 表示第
i
i
i 位,
j
j
j 取值
0
,
1
0,1
0,1 表示第
0
0
0 行,第
1
1
1 行。表示走完
i
i
i 行,且在第
i
i
i 列的位置是第
j
j
j 行的最小步数
转移方程:分四种情况,见代码
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int dp[N][2];
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t -- ) {
int n;
cin >> n;
string a, b;
cin >> a >> b;
int l = n, r = -1;
for (int i = 0; i < n; i ++ )
if (a[i] == '*' || b[i] == '*') {
l = i;
break;
}
for (int i = n - 1; i >= 0; i -- )
if (a[i] == '*' || b[i] == '*') {
r = i;
break;
}
for (int i = 0; i < n; i ++ ) dp[i][1] = dp[i][0] = INF;
if (a[l] == b[l] && a[l] == '*') dp[l][0] = dp[l][1] = 1;
else if (a[l] == '*') dp[l][0] = 0;
else dp[l][1] = 0;
for (int i = l + 1; i <= r; i ++ ) {
if (a[i] == '*' && b[i] == '*') {
dp[i][0] = min(dp[i - 1][0] + 2, dp[i - 1][1] + 2);
dp[i][1] = min(dp[i - 1][1] + 2, dp[i - 1][0] + 2);
} else if (a[i] == '*' && b[i] == '.') {
dp[i][0] = min(dp[i - 1][0] + 1, dp[i - 1][1] + 2);
dp[i][1] = min(dp[i - 1][1] + 2, dp[i - 1][0] + 2);
} else if (a[i] == '.' && b[i] == '*') {
dp[i][1] = min(dp[i - 1][1] + 1, dp[i - 1][0] + 2);
dp[i][0] = min(dp[i - 1][0] + 2, dp[i - 1][1] + 2);
} else {
dp[i][0] = min(dp[i - 1][0] + 1, dp[i - 1][1] + 2);
dp[i][1] = min(dp[i - 1][1] + 1, dp[i - 1][0] + 2);
}
}
cout << min(dp[r][0], dp[r][1]) << endl;
}
return 0;
}