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...