Advertisement
Derga

Untitled

Feb 21st, 2023
773
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.68 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <string>
  4. #include <vector>
  5.  
  6. std::string GetPath(const std::vector<int>& dp, std::size_t n, std::size_t m) {
  7.   std::string path;
  8.   int i = n - 1;
  9.   int j = m - 1;
  10.   while (i || j) {
  11.     int value_in_upper_cell = INT_MIN;
  12.     int value_in_left_cell = INT_MIN;
  13.     if (i) {
  14.       value_in_upper_cell = dp[i * m + j - n];
  15.     }
  16.     if (j) {
  17.       value_in_left_cell = dp[i * m + j - 1];
  18.     }
  19.     if (value_in_upper_cell >= value_in_left_cell) {
  20.       path += "D";
  21.       i--;
  22.     } else {
  23.       path += "R";
  24.       j--;
  25.     }
  26.   }
  27.   std::reverse(path.begin(), path.end());
  28.   return path;
  29. }
  30.  
  31. void start(const std::vector<int>& field, std::size_t n, std::size_t m) {
  32.   if (field.empty()) {
  33.     return;
  34.   }
  35.  
  36.   std::vector<int> dp(field.size());
  37.   dp[0] = field[0];
  38.  
  39.   for (std::size_t i = 0; i < n; i++) {
  40.     for (std::size_t j = 0; j < m; j++) {
  41.       if (i || j) {
  42.         int value_in_upper_cell = INT_MIN;
  43.         int value_in_left_cell = INT_MIN;
  44.         if (i) {
  45.           value_in_upper_cell = dp[i * m + j - n];
  46.         }
  47.         if (j) {
  48.           value_in_left_cell = dp[i * m + j - 1];
  49.         }
  50.         dp[i * m + j] = std::max(value_in_upper_cell, value_in_left_cell) + field[i * m + j];
  51.       }
  52.     }
  53.   }
  54.  
  55.   std::cout << dp.back() << '\n' << GetPath(dp, n, m);
  56. }
  57.  
  58. int main() {
  59.   std::ios_base::sync_with_stdio(false);
  60.   std::cin.tie(nullptr);
  61.  
  62.   std::size_t n, m;
  63.   std::cin >> n >> m;
  64.  
  65.   std::vector<int> field(n * m);
  66.   for (std::size_t i = 0; i < n; i++) {
  67.     for (std::size_t j = 0; j < m; j++) {
  68.       std::cin >> field.at(i * m + j);
  69.     }
  70.   }
  71.  
  72.   start(field, n, m);
  73.  
  74.   return 0;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement