Advertisement
Guest User

Untitled

a guest
Dec 10th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.60 KB | None | 0 0
  1. #include <fstream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <cctype>
  5.  
  6. using namespace std;
  7.  
  8. bool comp(pair<char, int> a, pair<char, int> b) {
  9. if (abs((int)a.first - (int)b.first) == 32)
  10. return a.first > b.first;
  11. else return tolower(a.first) < tolower(b.first);
  12. }
  13.  
  14. int main() {
  15. ifstream in("input.txt");
  16. ofstream out("output.txt");
  17. int n, m;
  18. in >> n >> m;
  19. char c;
  20. int k;
  21. vector<pair<char, int>> v(n * 7);
  22. vector<int> damage(14), cost(7);
  23. for (int i = 0; i < 14; i++)
  24. in >> damage[i];
  25. for (int i = 0; i < 7; i++)
  26. in >> cost[i];
  27. for (int i = 0; i < 7 * n; i++)
  28. in >> v[i].first >> v[i].second;
  29. sort(v.begin(), v.end(), comp);
  30. v.push_back({ 0, 0 });
  31. 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]
  32. for (int money = m; money >= 0; money--) {
  33. for (int group = 0; group < n * 7; group++) {
  34. for (int took = 0; took < 7; took++) {
  35. for (int cur = 0; cur < 4; cur++) {
  36. bool a = 0, A = 0;
  37. if (cur / 2 > 0) A = 1;
  38. if (cur % 2 > 0) a = 1;
  39. if (isupper(v[group].first)) {
  40. if (A) {
  41. if (tolower(v[group].first) == tolower(v[group + 1].first))
  42. 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)]);
  43. 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)]);
  44. }
  45. else {
  46. if (tolower(v[group].first) == tolower(v[group + 1].first))
  47. 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)]);
  48. 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)]);
  49. }
  50. }
  51. else {
  52. if (money >= v[group].second * cost[(v[group].first - 97)]) {
  53. if (A) {
  54. if (tolower(v[group].first) == tolower(v[group + 1].first))
  55. 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]);
  56. 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)]);
  57. }
  58. else {
  59. if (tolower(v[group].first) == tolower(v[group + 1].first))
  60. 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]);
  61. else
  62. 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]);
  63. }
  64. }
  65. if (a) {
  66. if (tolower(v[group].first) == tolower(v[group + 1].first))
  67. 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)]);
  68. 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)]);
  69. }
  70. else {
  71. if (tolower(v[group].first) == tolower(v[group + 1].first))
  72. 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)]);
  73. 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)]);
  74. }
  75. }
  76. if (tolower(v[group].first) == tolower(v[group + 1].first))
  77. dp[took][group + 1][money][cur] = max(dp[took][group + 1][money][cur], dp[took][group][money][cur]);
  78. else dp[took][group + 1][money][0] = max(dp[took][group + 1][money][0], dp[took][group][money][cur]);
  79. }
  80. }
  81. }
  82. }
  83. int mx = 0;
  84. for (int i = 0; i <= m; i++) {
  85. for (int j = 0; j < 4; j++) {
  86. mx = max(mx, dp[7][n * 7][i][j]);
  87. }
  88. }
  89. out << mx;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement