vector<int64_t> powp(r); powp[0] = 1; for (size_t i = 1; i < r; ++i) powp[i] = powp[i - 1] * p;
vector<size_t> a(n); for (size_t i = 0; i < n; ++i) cin >> a[i], --a[i];
vector<int64_t> v(m); for (size_t i = 0; i < m; ++i) cin >> v[i];
for (size_t i = 0; i < n; ++i) for (size_t j = 0; j < n; ++j) { for (size_t k = 0; k < m; ++k) for (size_t l = 0; l < r; ++l) F[i][j][k][l] = i64min; G[i][j] = 0; }
for (size_t i = 0; i < n; ++i) F[i][i][a[i]][0] = 0, G[i][i] = v[a[i]];
for (size_t len = 1; len <= n; ++len) { for (size_t i = 0, j = len; j < n; ++i, ++j) { for (size_t h = i; h < j; ++h) G[i][j] = max(G[i][j], G[i][h] + G[h + 1][j]); for (size_t k = 0; k < m; ++k) { for (size_t l = 0; l < r; ++l) { for (size_t h = i; h < j; ++h) F[i][j][k][l] = max(F[i][j][k][l], max(F[i][h][k][l] + G[h + 1][j], G[i][h] + F[h + 1][j][k][l])); if (l != 0) for (size_t h = i; h < j; ++h) F[i][j][k][l] = max(F[i][j][k][l], F[i][h][k][l - 1] + F[h + 1][j][k][l - 1]); G[i][j] = max(G[i][j], F[i][j][k][l] + v[k] * powp[l]); } } } } cout << G[0][n - 1] << '\n'; }