RC-u4 变牛的最快方法
作者:
logos--
,
2023-08-17 15:36:59
,
所有人可见
,
阅读 143
#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int N = 1010, M = 10010;
constexpr int inf = 1E18, mod = 100003;
int a[N], b[N], dp[N][N], n, m, edit[N][N];
vector<int> path;
inline void dfs(int i, int j) {
if(i == 0 && j == 0) {
return ;
}
if(edit[i][j] == 0) {
dfs(i - 1, j);
}else if(edit[i][j] == 1) {
dfs(i - 1, j - 1);
}else if(edit[i][j] == 2) {
dfs(i - 1, j - 1);
}else dfs(i, j - 1);
path.push_back(edit[i][j]);
}
inline void Main() {
int x;
while(cin >> x, x != -1) {
n ++;
a[n] = x;
}
while(cin >> x, x != -1) {
m ++;
b[m] = x;
}
for (int i = 0; i <= n; i ++) {
dp[i][0] = i;
edit[i][0] = 0;
}
for (int i = 0; i <= m; i ++) {
dp[0][i] = i;
edit[0][i] = 3;
}
for (int i = 1; i <= n; i ++) {
for (int j = 1; j <= m; j ++) {
if(a[i] == b[j]) {
dp[i][j] = dp[i - 1][j - 1];
edit[i][j] = 2;
}else {
int op = 3;
dp[i][j] = dp[i][j - 1] + 1;
if(dp[i][j] > dp[i - 1][j] + 1) {
op = 0;
dp[i][j] = dp[i - 1][j] + 1;
}
if(dp[i][j] > dp[i - 1][j - 1] + 1) {
op = 1;
dp[i][j] = dp[i - 1][j - 1] + 1;
}
edit[i][j] = op;
}
}
}
cout << dp[n][m] << '\n';
dfs(n, m);
int len = path.size();
for (int i = 0; i < len; i ++) {
cout << path[i];
}
}
signed main() {
cin.tie(nullptr)->sync_with_stdio(false);
int T = 1;
while(T --) Main();
return 0;
}