Advertisement
Gistrec

Maximum Subarray Problem

Nov 21st, 2019
285
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.16 KB | None | 0 0
  1. /* Example:
  2.  * 41  17  47
  3.  * 33 -16 -16
  4.  * 26 -30  36
  5.  * -3 -18 -19
  6.  * Max submatrix sum: 138
  7.  * Start (0, 2)
  8.  * End   (0, 2)
  9.  * 41  17  47
  10.  * 33 -16 -16
  11.  * 26 -30  36
  12.  */
  13. #include <iostream>
  14. #include <iomanip>
  15. #include <ctime>
  16. #include <array>
  17.  
  18. template <typename ElemType, size_t Row, size_t Column>
  19. using Matrix = std::array<std::array<ElemType, Column>, Row>;
  20.  
  21. template <typename Matrix>
  22. using StorageType = typename Matrix::value_type::value_type;
  23.  
  24. template <typename Matrix>
  25. auto getSubmatrixSum(const Matrix& matrix, size_t startX, size_t endX, size_t startY, size_t endY) {
  26.     StorageType<Matrix> sum{ 0 };
  27.     for (size_t x = startX; x <= endX; ++x) {
  28.         for (size_t y = startY; y <= endY; ++y) {
  29.             sum += matrix[x][y];
  30.         }
  31.     }
  32.     return sum;
  33. }
  34.  
  35. template <typename Matrix>
  36. void generateRandomMatrix(Matrix& matrix) {
  37.     // Инициализируем генератор псевдослучайных чисел
  38.     std::srand(unsigned(std::time(0)));
  39.  
  40.     for (size_t x = 0U; x < matrix.size(); x++) {
  41.         for (size_t y = 0U; y < matrix[x].size(); y++) {
  42.             matrix[x][y] = std::rand() % 100 - 50;
  43.         }
  44.     }
  45. }
  46.  
  47. int main() {
  48.     constexpr size_t rowCount = 4U;
  49.     constexpr size_t colCount = 3U;
  50.  
  51.     using ElemType = float;
  52.  
  53.     Matrix<ElemType, rowCount, colCount> matrix;
  54.     generateRandomMatrix(matrix);
  55.  
  56.     // Выводим матрицу
  57.     for (size_t x = 0U; x < rowCount; ++x) {
  58.         for (size_t y = 0U; y < colCount; ++y) {
  59.             std::cout << std::setw(3) << matrix[x][y] << " ";
  60.         }
  61.         std::cout << std::endl;
  62.     }
  63.  
  64.     // Храним данные о максимальной сумме
  65.     struct {
  66.         ElemType sum = std::numeric_limits<ElemType>::min();
  67.         size_t startX;
  68.         size_t startY;
  69.         size_t endX;
  70.         size_t endY;
  71.     } submatrix;
  72.  
  73.     // Перемещаем 'начальную' клетку
  74.     for (size_t startX = 0U; startX < rowCount; ++startX) {
  75.         for (size_t startY = 0U; startY < colCount; ++startY) {
  76.  
  77.             // Перемещаем конечную клетку
  78.             for (size_t endX = rowCount - 1U;; --endX) {
  79.                 for (size_t endY = colCount - 1U;; endY--) {
  80.                     // Считаем сумму текущей подматрицы
  81.                     ElemType sum = getSubmatrixSum(matrix, startX, endX, startY, endY);
  82.  
  83.                     // Если сумма элементов текущей подматрицы больше, то сохраняем
  84.                     if (sum > submatrix.sum) {
  85.                         submatrix.sum = sum;
  86.                         submatrix.startX = startX;
  87.                         submatrix.startY = startY;
  88.                         submatrix.endX = endX;
  89.                         submatrix.endY = endY;
  90.                     }
  91.                     if (endY == startY) break;
  92.                 }
  93.                 if (endX == startX) break;
  94.             }
  95.         }
  96.     }
  97.  
  98.     std::cout << "Max submatrix sum: " << submatrix.sum << std::endl;
  99.     std::cout << "Start (" << submatrix.startX << ", " << submatrix.endX << ")" << std::endl;
  100.     std::cout << "End   (" << submatrix.startY << ", " << submatrix.endY << ")" << std::endl;
  101.  
  102.     // Выводим подматрицу
  103.     for (size_t x = submatrix.startX; x <= submatrix.endX; ++x) {
  104.         for (size_t y = submatrix.startY; y <= submatrix.endY; ++y) {
  105.             std::cout << std::setw(3) << matrix[x][y] << " ";
  106.         }
  107.         std::cout << std::endl;
  108.     }
  109.  
  110.     system("pause");
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement