#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2005;
string dp[MAXN][MAXN][2];
int a[MAXN], b[MAXN];
int n;
string INF = string(5000, 'Z'); // chuỗi rất lớn để so sánh
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cin >> n;
for (int i = 1; i <= 2*n; i++) cin >> a[i];
for (int i = 1; i <= 2*n; i++) cin >> b[i];
// Khởi tạo tất cả là INF
for (int i = 0; i <= n; i++)
for (int j = 0; j <= n; j++)
dp[i][j][0] = dp[i][j][1] = INF;
// Bước đầu tiên
dp[1][0][0] = "A"; // lấy A đầu tiên
dp[0][1][1] = "B"; // lấy B đầu tiên
for (int i = 2; i <= 2*n; i++) {
for (int j = 0; j <= min(i, n); j++) {
int k = i - j;
if (k < 0 || k > n) continue;
// ---- LẤY A ----
if (j > 0) {
// từ A -> A
if (dp[j-1][k][0] != INF && a[i] >= a[i-1]) {
dp[j][k][0] = min(dp[j][k][0], dp[j-1][k][0] + "A");
}
// từ B -> A
if (dp[j-1][k][1] != INF && a[i] >= b[i-1]) {
dp[j][k][0] = min(dp[j][k][0], dp[j-1][k][1] + "A");
}
}
// ---- LẤY B ----
if (k > 0) {
// từ B -> B
if (dp[j][k-1][1] != INF && b[i] >= b[i-1]) {
dp[j][k][1] = min(dp[j][k][1], dp[j][k-1][1] + "B");
}
// từ A -> B
if (dp[j][k-1][0] != INF && b[i] >= a[i-1]) {
dp[j][k][1] = min(dp[j][k][1], dp[j][k-1][0] + "B");
}
}
}
}
// Lấy kết quả tốt nhất giữa 2 cách kết thúc
string ans = min(dp[n][n][0], dp[n][n][1]);
if (ans == INF) cout << -1;
else cout << ans;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |