Submission #1181703

#TimeUsernameProblemLanguageResultExecution timeMemory
1181703mehmetkaganVisiting Singapore (NOI20_visitingsingapore)C++20
10 / 100
12 ms19272 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define int ll

int32_t main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int K, n, m, A, B;
    cin >> K >> n >> m >> A >> B;
    vector<int> V(K + 1);
    for (int i = 1; i <= K; ++i) cin >> V[i];

    vector<int> S(n + 1), T(m + 1);
    for (int i = 1; i <= n; ++i) cin >> S[i];
    for (int i = 1; i <= m; ++i) cin >> T[i];

    const int INF = 1e18;
    vector<vector<int>> dp(n + 1, vector<int>(m + 1, -INF));
    dp[0][0] = 0;

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j <= m; ++j) {
            if (dp[i][j] == -INF) continue;
            int cost = A + B;
            dp[i + 1][j] = max(dp[i + 1][j], dp[i][j] + cost);
            if (j < m && S[i + 1] == T[j + 1]) {
                dp[i + 1][j + 1] = max(dp[i + 1][j + 1], dp[i][j] + V[T[j + 1]]);
            }
        }
    }

    int ans = -INF;

    for (int i = 0; i <= n; ++i) {
        for (int j = 0; j <= m; ++j) {
            int remain = m - j;
            int penalty = 0;
            if (remain > 0) penalty = A + remain * B;
            ans = max(ans, dp[i][j] + penalty);
        }
    }

    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...