Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <vector>
- #include <algorithm>
- #include <cctype>
- using namespace std;
- bool comp(pair<char, int> a, pair<char, int> b) {
- if (abs((int)a.first - (int)b.first) == 32)
- return a.first > b.first;
- else return tolower(a.first) < tolower(b.first);
- }
- int main() {
- ifstream in("input.txt");
- ofstream out("output.txt");
- int n, m;
- in >> n >> m;
- char c;
- int k;
- vector<pair<char, int>> v(n * 7);
- vector<int> damage(14), cost(7);
- for (int i = 0; i < 14; i++)
- in >> damage[i];
- for (int i = 0; i < 7; i++)
- in >> cost[i];
- for (int i = 0; i < 7 * n; i++)
- in >> v[i].first >> v[i].second;
- sort(v.begin(), v.end(), comp);
- v.push_back({ 0, 0 });
- vector<vector<vector<vector<int>>>> dp(8, vector<vector<vector<int>>>(n * 7 + 1, vector<vector<int>>(m + 1, vector<int>(4))));//[took][group][money][in group]
- for (int money = m; money >= 0; money--) {
- for (int group = 0; group < n * 7; group++) {
- for (int took = 0; took < 7; took++) {
- for (int cur = 0; cur < 4; cur++) {
- bool a = 0, A = 0;
- if (cur / 2 > 0) A = 1;
- if (cur % 2 > 0) a = 1;
- if (isupper(v[group].first)) {
- if (A) {
- if (tolower(v[group].first) == tolower(v[group + 1].first))
- dp[took][group + 1][money][cur] = max(dp[took][group + 1][money][cur], dp[took][group][money][cur] + v[group].second * damage[(v[group].first - 58)]);
- else dp[took][group + 1][money][0] = max(dp[took][group + 1][money][0], dp[took][group][money][cur] + v[group].second * damage[(v[group].first - 58)]);
- }
- else {
- if (tolower(v[group].first) == tolower(v[group + 1].first))
- dp[took + 1][group + 1][money][cur + 2] = max(dp[took + 1][group + 1][money][cur + 2], dp[took][group][money][cur] + v[group].second * damage[(v[group].first - 58)]);
- else dp[took + 1][group + 1][money][0] = max(dp[took + 1][group + 1][money][0], dp[took][group][money][cur] + v[group].second * damage[(v[group].first - 58)]);
- }
- }
- else {
- if (money >= v[group].second * cost[(v[group].first - 97)]) {
- if (A) {
- if (tolower(v[group].first) == tolower(v[group + 1].first))
- dp[took][group + 1][money - v[group].second * cost[(v[group].first - 97)]][cur] = max(dp[took][group + 1][money - v[group].second * cost[(v[group].first - 97)]][cur], dp[took][group][money][cur] + v[group + 1].second * damage[toupper((v[group].first)) - 58]);
- else dp[took][group + 1][money - v[group].second * cost[(v[group].first - 97)]][0] = max(dp[took][group + 1][money - v[group].second * cost[(v[group].first - 97)]][0], dp[took][group][money][cur] + v[group + 1].second * damage[(toupper(v[group].first) - 58)]);
- }
- else {
- if (tolower(v[group].first) == tolower(v[group + 1].first))
- dp[took + 1][group + 1][money - v[group].second * cost[(v[group].first - 97)]][cur + 2] = max(dp[took + 1][group + 1][money - v[group].second * cost[(v[group].first - 97)]][cur + 2], dp[took][group][money][cur] + v[group].second * damage[toupper((v[group].first)) - 58]);
- else
- dp[took + 1][group + 1][money - v[group].second * cost[(v[group].first - 97)]][0] = max(dp[took + 1][group + 1][money - v[group].second * cost[(v[group].first - 97)]][0], dp[took][group][money][cur] + v[group].second * damage[toupper((v[group].first)) - 58]);
- }
- }
- if (a) {
- if (tolower(v[group].first) == tolower(v[group + 1].first))
- dp[took][group + 1][money][cur] = max(dp[took][group + 1][money][cur], dp[took][group][money][cur] + v[group].second * damage[(v[group].first - 97)]);
- else dp[took][group + 1][money][0] = max(dp[took][group + 1][money][0], dp[took][group][money][cur] + v[group].second * damage[(v[group].first - 97)]);
- }
- else {
- if (tolower(v[group].first) == tolower(v[group + 1].first))
- dp[took + 1][group + 1][money][cur + 1] = max(dp[took + 1][group + 1][money][cur + 1], dp[took][group][money][cur] + v[group].second * damage[(v[group].first - 97)]);
- else dp[took + 1][group + 1][money][0] = max(dp[took + 1][group + 1][money][0], dp[took][group][money][cur] + v[group].second * damage[(v[group].first - 97)]);
- }
- }
- if (tolower(v[group].first) == tolower(v[group + 1].first))
- dp[took][group + 1][money][cur] = max(dp[took][group + 1][money][cur], dp[took][group][money][cur]);
- else dp[took][group + 1][money][0] = max(dp[took][group + 1][money][0], dp[took][group][money][cur]);
- }
- }
- }
- }
- int mx = 0;
- for (int i = 0; i <= m; i++) {
- for (int j = 0; j < 4; j++) {
- mx = max(mx, dp[7][n * 7][i][j]);
- }
- }
- out << mx;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement