Advertisement
cincout

Подводная лодка

Mar 16th, 2019
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.83 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3.  
  4. using namespace std;
  5.  
  6. const int N = 2500;
  7. int decode[278];
  8. string b[2500];
  9. int a[N][N];
  10.  
  11. int top_max[N][N];
  12. int bot_max[N][N];
  13.  
  14. int _end[N][N]; // считаем только с концовкой
  15. int _begin[N][N]; // считаем только с началом
  16. int sht[N][N];
  17.  
  18. signed main()
  19. {
  20. #ifndef arrias
  21. freopen("submarine.in", "r", stdin);
  22. freopen("submarine.out", "w", stdout);
  23. #endif
  24. int k;
  25. cin >> k;
  26. for (char c = 'a'; c < 'a' + k; ++c) {
  27. int t;
  28. cin >> t;
  29. decode[c] = t;
  30. }
  31. int h, w;
  32. cin >> h >> w;
  33. for (int i = 0; i < h; ++i) {
  34. cin >> b[i];
  35. for (int j = 0; j < w; ++j) {
  36. a[i][j] = decode[b[i][j]];
  37. }
  38. }
  39. for (int j = 0; j < w; ++j) {
  40. vector <int> pref(h);
  41. pref[0] = a[0][j];
  42. for (int i = 1; i < h; ++i)
  43. pref[i] = pref[i - 1] + a[i][j];
  44. int pref_min = 0;
  45. for (int i = 0; i < h; ++i) {
  46. top_max[i][j] = pref[i] - pref_min;
  47. pref_min = min(pref_min, pref[i]);
  48. }
  49. pref[h - 1] = a[h - 1][j];
  50. for (int i = h - 2; i > -1; --i) {
  51. pref[i] = pref[i + 1] + a[i][j];
  52. }
  53. pref_min = 0;
  54. for (int i = h - 1; i > -1; --i) {
  55. bot_max[i][j] = pref[i] - pref_min;
  56. pref_min = min(pref_min, pref[i]);
  57. }
  58. }
  59. for (int i = 0; i < h; ++i) {
  60. for (int j = 0; j < w; ++j) {
  61. bot_max[i][j] -= a[i][j];
  62. top_max[i][j] -= a[i][j];
  63. sht[i][j] = top_max[i][j] + bot_max[i][j];
  64. }
  65. }
  66. for (int i = 0; i < h; ++i) {
  67. // считаем end
  68. vector <int> pref(w);
  69. pref[w - 1] = a[i][w - 1];
  70. for (int j = w - 2; j > -1; --j)
  71. pref[j] = pref[j + 1] + a[i][j];
  72. _end[i][w - 1] = a[i][w - 1] + sht[i][w - 1];
  73. int pref_min = min(0ll, pref[w - 1]);
  74. for (int j = w - 2; j > -1; --j) {
  75. _end[i][j] = max(_end[i][j + 1] + a[i][j], pref[j] - pref_min + sht[i][j]);
  76. pref_min = min(pref_min, pref[j]);
  77. }
  78. // считаем begin
  79. pref.assign(w, 0);
  80. pref[0] = a[i][0];
  81. for (int j = 1; j < w; ++j) {
  82. pref[j] = pref[j - 1] + a[i][j];
  83. }
  84. _begin[i][0] = a[i][0] + top_max[i][0];
  85. pref_min = min(0ll, pref[0]);
  86. for (int j = 1; j < w; ++j) {
  87. _begin[i][j] = max(_begin[i][j - 1] + a[i][j], pref[j] - pref_min + top_max[i][j]);
  88. pref_min = min(pref_min, pref[j]);
  89. }
  90. }
  91. int ans = -1e18;
  92. for (int i = 0; i < h; ++i) {
  93. for (int j = 0; j + 1 < w; ++j) {
  94. ans = max(ans, _begin[i][j] + _end[i][j + 1]);
  95. }
  96. }
  97. cout << ans;
  98. return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement