Submission #1291233

#TimeUsernameProblemLanguageResultExecution timeMemory
1291233hahaBuilding 4 (JOI20_building4)C++20
0 / 100
133 ms252220 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...