제출 #1291234

#제출 시각아이디문제언어결과실행 시간메모리
1291234haha건물 4 (JOI20_building4)C++20
0 / 100
124 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');

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];

    for(int i = 0; i <= n; i++)
        for(int j = 0; j <= n; j++)
            dp[i][j][0] = dp[i][j][1] = INF;

    dp[1][0][0] = "A";
    dp[0][1][1] = "B";

    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;
            // take A
            if(j>0){
                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");
                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");
            }
            // take B
            if(k>0){
                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");
                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");
            }
        }
    }

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