fork download
  1. #include <bits/stdc++.h>
  2. #define ll long long
  3. #define ld long double
  4. #define nmax (long long)(1e6+7)
  5. #define oo (long long)(1e18)
  6. #define INF (int)(1e9+7)
  7. #define fi first
  8. #define se second
  9. #define pii pair<int, int>
  10. #define Hung ""
  11. using namespace std;
  12.  
  13.  
  14. ll m, n , x, y, t;
  15. ll dx[] = {-1, 0, 1, 0};
  16. ll dy[] = {0, 1, 0, -1};
  17. struct diem{
  18. ll ui, uj, vi, vj;
  19. ll sum;
  20. ll su, sv;
  21. };
  22.  
  23. int main()
  24. {
  25. ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  26. if (fopen(Hung".inp", "r")){
  27. freopen(Hung".inp", "r", stdin);
  28. freopen(Hung".out", "w", stdout);
  29. }
  30. cin >> m >> n >> x >> y >> t;
  31. vector<vector<ll>> a(m + 2, vector<ll>(n + 2, 0));
  32. for (ll i = 1; i <= m; i++)
  33. for (ll j = 1; j <= n; j++)
  34. cin >> a[i][j];
  35.  
  36. if (m == 1 && n == 1){
  37. ll res = (t + 1) / 2;
  38. cout << res * a[1][1];
  39. return 0;
  40. }
  41. vector<diem> Edges;
  42. for(ll i = 1; i <= m; i++){
  43. for(ll j = 1; j <= n; j++){
  44. for(ll d = 0; d < 4; d++){
  45. ll ni = i + dx[d];
  46. ll nj = j + dy[d];
  47. if (ni >= 1 && ni <= m && nj >= 1 && nj <= n){
  48. if (i < ni || (i == ni && j < nj)){
  49. Edges.push_back({i, j, ni, nj, a[i][j] + a[ni][nj], a[i][j], a[ni][nj]});
  50. }
  51. }
  52. }
  53. }
  54. }
  55. ll D = min(t, m + n + 2);
  56.  
  57. vector<vector<ll>> dp0(m + 2, vector<ll>(n + 2, -oo)), dp1(m + 2, vector<ll>(n + 2, -oo));
  58. dp0[x][y] = 0;
  59.  
  60. for(ll k = 1; k <= D; k++){
  61. for(ll i = 1; i <= m; i++)
  62. for(ll j = 1; j <= n; j++)
  63. dp1[i][j] = -oo;
  64. for(ll i = 1; i <= m; i++){
  65. for(ll j = 1; j <= n; j++){
  66. ll tmp = dp0[i][j];
  67. if (tmp == -oo) continue;
  68. for(ll d = 0; d < 4; d++){
  69. ll ni = i + dx[d];
  70. ll nj = j + dy[d];
  71. if (ni < 1 || ni > m || nj < 1 || nj > n) continue;
  72. ll nv = tmp + a[ni][nj];
  73. if (nv > dp1[ni][nj])
  74. dp1[ni][nj] = nv;
  75. }
  76. }
  77. }
  78. dp0.swap(dp1);
  79. }
  80. if (t <= D) {
  81. ll res = 0;
  82. for(ll i = 1; i <= m; i++)
  83. for(ll j = 1; j <= n; j++)
  84. res = max(res, dp0[i][j]);
  85. cout << res;
  86. return 0;
  87. }
  88. ll k = (t - D) / 2;
  89. ll r = (t - D) % 2;
  90. ll res = 0;
  91. for(diem x : Edges){
  92. ll fu = dp0[x.ui][x.uj];
  93. ll fv = dp0[x.vi][x.vj];
  94. if (fu > -oo){
  95. ll cand = fu + k * x.sum + (r ? x.sv : 0);
  96. res = max(res, cand);
  97. }
  98. if (fv > -oo){
  99. ll cand = fv + k * x.sum + (r ? x.su : 0);
  100. res = max(res, cand);
  101. }
  102. }
  103. cout << res;
  104. return 0;
  105. }
  106.  
Success #stdin #stdout 0.01s 5284KB
stdin
Standard input is empty
stdout
Standard output is empty