제출 #889921

#제출 시각아이디문제언어결과실행 시간메모리
889921TAhmed33Copy and Paste 3 (JOI22_copypaste3)C++98
15 / 100
3097 ms9052 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll dp[31][31][31][31]; bool pre[31][31][31][31]; string s; ll a, b, c, n; ll ans (int l1, int r1, int l2, int r2) { ll &ret = dp[l1][r1][l2][r2]; if (ret != -1) return ret; /*cout << (l1 == 0 ? "?" : s.substr(l1, r1 - l1 + 1)) << " "; cout << (l2 == 0 ? "?" : s.substr(l2, r2 - l2 + 1)) << " "; cout << '\n';*/ if (l1 == 1 && r1 == n) return ret = 0; ret = 1e18; if (l1 && r1 != n) ret = min(ret, a + ans(l1, r1 + 1, l2, r2)); if (!l1) { for (int i = 1; i <= n; i++) ret = min(ret, a + ans(i, i, l2, r2)); } if (l1) ret = min(ret, b + ans(0, 0, l1, r1)); if (l1 && l2 && r1 + (r2 - l2 + 1) <= n && pre[r1 + 1][r1 + r2 - l2 + 1][l2][r2]) { ret = min(ret, c + ans(l1, r1 + r2 - l2 + 1, l2, r2)); } if (!l1 && l2) { for (int i = 1; i + (r2 - l2) <= n; i++) { if (pre[i][i + r2 - l2][l2][r2]) ret = min(ret, c + ans(i, i + r2 - l2, l2, r2)); } } return ret; } int main () { memset(dp, -1, sizeof(dp)); cin >> n >> s >> a >> b >> c; s.insert(s.begin(), '0'); for (int i = 1; i <= n; i++) { for (int j = i; j <= n; j++) { for (int l = 1; l <= n; l++) { for (int m = l; m <= n; m++) { if (m - l != j - i) continue; pre [i][j][l][m] = 1; for (int t = i; t <= j; t++) { pre[i][j][l][m] &= s[t] == s[l + t - i]; } } } } } cout << ans(0, 0, 0, 0) << '\n'; }
#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...