Как найти сумму максимальных элементов в матрице

Дана матрица 4×4. Нужно найти сумму наибольших элементов строк матрицы.
Алгоритм создал, но, бывает, выдает отрицательные числа. Я думаю, проблема в том, что когда элементы строки матрицы, следующие за первым и больше первого, повторяются, алгоритм не срабатывает.

35 30 35 20

15 15 25 25

35 30 20 15

20 15 35 20

Помогите решить это.
Алгоритм в коде помечен комментарием.

Код:

class Lab2
{
    public static void main(String[] args)
    {
         byte a = 5;
         byte sum = 0, max;
         byte B[][] = new byte[4][4];
         byte C[][] = new byte[4][4];

         for(int i = 0; i < 4; i++)
         {
             for(int j = 0; j < 4; j++)
             {
                 B[i][j] = (byte) (3 + (int) (Math.random() * 5));
             } 
         }

         System.out.println("Matrix B:");

         for(int i = 0; i < 4; i++)
         {
             for(int j = 0; j < 4; j++)
             {
                 System.out.print(B[i][j] + " ");
             }
             System.out.println();
         }

         for(int i = 0; i < 4; i++)
         {
             for(int j = 0; j < 4; j++)
             {
                 C[i][j] = (byte) (B[i][j] * a);
             } 
         }

         System.out.println("Matrix C:");

         for(int i = 0; i < 4; i++)
         {
             for(int j = 0; j < 4; j++)
             {
                 System.out.print(C[i][j] + " ");
             }
             System.out.println();
         }
         //counting the sum of the greatest elements of each row

         for(int i = 0; i < 4; i++)  // ПРОБЛЕМА ЗДЕСЬ
         {
             max = C[i][0];
             for(int j = 1; j < 4; j++)
             {
                 if(C[i][j] > max)
                 {
                     max = C[i][j];
                 }
             }
             sum += max;
         }
         System.out.println("The sum of the greatest elements of each row is: " + sum);
    }
}

задан 9 фев 2018 в 21:35

Andrey Safonov's user avatar

Вы используете для всех целочисленных переменных тип byte, который в Java имеет диапазон от -128 до 127. Если при прибавлении к такой переменной получается число больше 127, происходит т.н. переполнение и результирующее значение будет, можно сказать, циклически сдвинуто по этому диапазону. Результат будет не тот, который ожидался.

Если в матрице B у вас относительно небольшие числа, то в матрице A они могут достигать 35. То есть тип самой матрицы выбран верно. Но сумма максимальных элементов строк уже может достигать 35*4 = 140, что при переполнении даст

-128 + (140 - 128) = -116  // вычитаем переполнение

Соответственно, для переменной sum нужно использовать более «широкий» тип, например, short.

ответ дан 9 фев 2018 в 22:03

Кирилл Малышев's user avatar

Кирилл МалышевКирилл Малышев

10.8k1 золотой знак18 серебряных знаков34 бронзовых знака

Полное условие задачи звучит так: дана матрица размером N*N, содержащая положительные и отрицательные числа. Напишите код поиска субматрицы с максимально возможной суммой.

Существует множество решений этой задачи. Мы начнем с метода грубой силы, а затем займемся оптимизацией.

Метод грубой силы: O(N⁶)

Подобно другим задачам, связанным с поиском максимума, у этой задачи есть простое решение. Достаточно проверить все субматрицы, вычислить сумму каждой и найти самую большую.

Чтобы проверить все субматрицы и избежать повторов. Придется пройтись по всем упорядоченным парам строк и затем по всем упорядоченным парам столбцов.

Это решение потребует O(N⁶) времени, так как необходимо проверить O(N⁴) матриц, а проверка одной матрицы занимает O(N²) времени.

Динамическое программирование: O(N⁴)

Обратите внимание, что предыдущее решение работает медленно из-за расчета суммы элементов матрицы — O(N²) — очень медленная операция. Можно ли сократить это время? Да! Мы можем уменьшить время computeSum до O(1).

Посмотрите на следующий прямоугольник:

scheme

Предположим, что нам известны следующие значения:

ValD = area(point(0, 0) -> point(x2, y2))
ValC = area(point(0, 0) -> point(x2, yl))
ValB = area(point(0, 0) -> point(xl, y2))
ValA = area(point(0, 0) -> point(xl, yl))

Каждое Val* начинается в исходной точке и заканчивается в нижнем правом углу подпрямоугольника. Про эти значения мы знаем следующее:

area(D) = ValD - area(A union С) - area(A union B) + area(A).

Или:

area(D) = ValD - ValB - ValC + ValA

Данная информация позволит эффективно рассчитать эти значения для всех точек матрицы:

Уа1(х, у) = Уа1(х-1, у) + Уа1(у-1, х) - Уа1(х-1, у-1)

Можно заранее рассчитать подобные значения и затем найти максимальную субматрицу. Следующий код реализует данный алгоритм.

int getMaxMatrix(int[][] original) {
  int maxArea = Integer.MIN_VALUE; // Важно! Max может быть < 0
  int rowCount = original.length;
  int columnCount = original[0].length;
  int[][] matrix = precomputeMatrix(original);
  for (int rowl = 0; rowl < rowCount; rowl++) {
    for (int row2 = rowl; row2 < rowCount; row2++) {
      for (int coli = 0; coli < columnCount; coll++) {
        for (int col2 = coli; col2 < columnCount; col2++) {
          maxArea = Math.max(maxArea, computeSum(matrix, rowl, row2, coli, col2));
        }
      }
    }
  }
  return maxArea
}

int[][] precomputeMatrix(int[][] matrix) {
  int[][] sumMatrix = new int[matrix.length][matrix[0].length]; 
  for (int i = 0; i < matrix.length; i++) {
    for (int j = 0; j < matrix.length; j++) {
      if (i == 0 && j == 0) { // первая ячейка
        sumMatrix[i][j] = matrix[i][j];
      } else if (j == 0) { // ячейка в первой колонке
        sumMatrix[i][j] = sumMatrix[i - l][j] + matrix[i][j];
      } else if (i == 0) { // ячейка в первом ряду
        sumMatrix[i][j] = sumMatrix[i][j-1] + matrix[i][j]; 
      } else {
        sumMatrix[i][j] = sumMatrix[i-l][j] +
        sumMatrix[i][j-1] - sumMatrix[i-l][j-1] + 
        matrix[i][j];
      }
    }
  }
  return sumMatrix;
}

int computeSum(int[][] sumMatrix, int il, int i2, int jl, int j2) {
  if (il == 0 && jl == 0) { // начинаем с ряда 0, колонки 0
    return sumMatrix[i2][j2];
  } else if (il == 0) { // начинаем с ряда 0
    return sumMatrix[i2][j2] - sumMatrix[i2][jl - 1];
  } else if (jl == 0) { // начинаем с колонки 0
    return sumMatrix[i2][j2] - sumMatrix[il-l][j2];
  } else {
    return sumMatrix[i2][j2] - sumMatrix[i2][jl-1] - sumMatrix[il-l][j2] + sumMatrix[il-1][jl-1];
  }
}

Оптимизированное решение: O(N³)

Невероятно, но существует еще более оптимальное решение. Если у нас есть R строк и С столбцов, то задачу можно решить за О(R²C) времени.

Вспомните решение задачи про поиск максимального субмассива: для массива целых чисел (integer) найдите субмассив с максимальной суммой. Такой максимальный субмассив можно найти за О(N) времени. Давайте используем это решение для нашей задачи.

Каждую субматрицу можно представить в виде последовательности строк и последовательности столбцов. Можно пройтись по строкам и найти столбцы, дающие максимальную сумму.

Код будет таким:

maxSum = 0
foreach rowStart in rows
foreach rowEnd in rows
/* У нас есть количество возможных субматриц с границами 
* rowStart и rowEnd
* Найдите границы colStart и colEnd, дающие
* максимальную сумму. */
maxSum = max(runningMaxSum, maxSum)
return maxSum

Теперь остается вопрос: как найти «лучшие» colStart и colEnd?

Рассмотрим субматрицу:

scheme1

Нам необходимо найти colStart и colEnd, которые дают нам максимально возможную сумму всех субматриц rowStart сверху и rowEnd снизу. Можно вычислить сумму каждого столбца и использовать функцию maximumSubArray, которая обсуждалась в начале решения этой задачи.

В предыдущем примере максимальный субмасив охватывал пространство с первой по четвертую колонку. Это означает, что максимальная субматрица должна простираться от (rowStart, первый столбец) до (rowEnd, четвертый столбец).

Теперь мы можем записать следующий псевдокод:

maxSum = 0
foreach rowStart in rows
foreach rowEnd in rows
foreach col in columns
partialSum[col] = sum of matrix[rowStart, col] through
matrix[rowEnd, col]
runningMaxSum = maxSubArray(partialSum)
maxSum = max(runningMaxSum, maxSum)
return maxSum

Вычисление суммы в строках 5 и 6 занимает R*C времени (так как требует итерации от rowStart до rowEnd), что дает общее время выполнения О(R ³ C).

В строках 5 и 6 мы добавляли a[0]…a[i] с нуля, даже если на предыдущей итерации внешнего цикла добавились a[0]…a[i-1]. Давайте избавимся от двойной работы.

maxSum = 0
foreach rowStart in rows
clear array partialSum
foreach rowEnd in rows
foreach col in columns
partialSum[col] += matrix[rowEnd, col]
runningMaxSum = maxSubArray(partialSum)
maxSum = max(runningMaxSum, maxSum)
return maxSum

Полная версия кода выглядит так:

public void clearArray(int[] array) {
  for (int i = 0; i < array.length; i++) {
    array[i] = 0;
  }
}

public static int maxSubMatrix(int[][] matrix) {
  int rowCount = matrix.length;
  int colCount = matrix[0].length;

  int[] partialSum = new int[colCount];
  int maxSum = 0; // Макс, сумма = 0 (матрица пуста)

  for (int rowStart = 0; rowStart < rowCount; rowStart++) {
    clearArray(partialSum);

    for (int rowEnd = rowStart; rowEnd < rowCount; rowEnd++) {
      for (int i = 0; i < colCount; i++) {
        partialSum[i] += matrix[rowEnd][i]j
      }

      int tempMaxSum = maxSubArray(partialSum, colCount);

      /* Если вы хотите отслеживать координаты, добавьте
       * код здесь, чтобы сделать это. */
      maxSum = Math.max(maxSum, tempMaxSum);
    }
  }
  return maxSum;
}

public static int maxSubArray(int array[], int N) {
  int maxSum = 0;
  int runningSum = 0;

  for (int i = 0; i < N; i++) {
    runningSum += array[i];
    maxSum = Math.max(maxSum, runningSum);

    /*  Если runningSum < 0, нет смысла продолжать ряд
      * Сброс. */
    if  (runningSum < 0) {
      runningSum  = 0;
    }
  }
  return  maxSum;
}

Это чрезвычайно сложная задача. Вряд ли вы сможете решить подобную задачу на собеседовании без подсказки интервьюера.

Разбор задачи по книге «Карьера программиста. Как устроиться на работу в Google, Microsoft или другую ведущую IT-компанию»

Given an N*N matrix. The task is to find the index of a row with the maximum sum. That is the row whose sum of elements is maximum.

Examples

Input : mat[][] = {
            { 1, 2, 3, 4, 5 },
            { 5, 3, 1, 4, 2 },
            { 5, 6, 7, 8, 9 },
            { 0, 6, 3, 4, 12 },
            { 9, 7, 12, 4, 3 },
            }; 

Output : Row 3 has max sum 35

Input : mat[][] = { 
          { 1, 2, 3 },
          { 4, 2, 1 },
          { 5, 6, 7 },
          };
Output : Row 3 has max sum 18

The idea is to traverse the matrix row-wise and find the sum of elements in each row and check for every row if current sum is greater than the maximum sum obtained till the current row and update the maximum_sum accordingly. 

Algorithm:

  • Define a constant N as the number of rows and columns in the matrix.
  • Define a function colMaxSum that takes a 2D array of integers mat of size N*N as its input.
  • Initialize two variables idx and maxSum to -1 and INT_MIN respectively.
  • Traverse the matrix row-wise.
  • For each row, calculate the sum of all the elements in that row.
  • If the sum of the current row is greater than the current maxSum, update maxSum to be the sum of the current row and set idx to be the index of the current row.
  • Return a pair of integers, with the first element being the index of the row with the maximum sum (idx) and the second element being the maximum sum (maxSum).

Pseudocode:

1. N ← number of rows and columns in the matrix
2. function colMaxSum(mat[N][N])
3.     idx ← -1
4.     maxSum ← INT_MIN
5.     for i from 0 to N-1
6.         sum ← 0
7.         for j from 0 to N-1
8.             sum ← sum + mat[i][j]
9.         if sum > maxSum
10.            maxSum ← sum
11.            idx ← i
12.    return pair(idx, maxSum)
13. end function

Below is the implementation of the above approach:

C++

#include <bits/stdc++.h>

using namespace std;

#define N 5 // No of rows and column

pair<int, int> colMaxSum(int mat[N][N])

{

    int idx = -1;

    int maxSum = INT_MIN;

    for (int i = 0; i < N; i++) {

        int sum = 0;

        for (int j = 0; j < N; j++) {

            sum += mat[i][j];

        }

        if (sum > maxSum) {

            maxSum = sum;

            idx = i;

        }

    }

    pair<int, int> res;

    res = make_pair(idx, maxSum);

    return res;

}

int main()

{

    int mat[N][N] = {

        { 1, 2, 3, 4, 5 },  { 5, 3, 1, 4, 2 },

        { 5, 6, 7, 8, 9 },  { 0, 6, 3, 4, 12 },

        { 9, 7, 12, 4, 3 },

    };

    pair<int, int> ans = colMaxSum(mat);

    cout << "Row " << ans.first + 1 << " has max sum "

         << ans.second;

    return 0;

}

Java

import java.util.ArrayList;

class MaxSum {

    public static int N;

    static ArrayList<Integer> colMaxSum(int mat[][])

    {

        int idx = -1;

        int maxSum = Integer.MIN_VALUE;

        for (int i = 0; i < N; i++) {

            int sum = 0;

            for (int j = 0; j < N; j++) {

                sum += mat[i][j];

            }

            if (maxSum < sum) {

                maxSum = sum;

                idx = i;

            }

        }

        ArrayList<Integer> res = new ArrayList<>();

        res.add(idx);

        res.add(maxSum);

        return res;

    }

    public static void main(String[] args)

    {

        N = 5;

        int[][] mat = {

            { 1, 2, 3, 4, 5 },  { 5, 3, 1, 4, 2 },

            { 5, 6, 7, 8, 9 },  { 0, 6, 3, 4, 12 },

            { 9, 7, 12, 4, 3 },

        };

        ArrayList<Integer> ans = colMaxSum(mat);

        System.out.println("Row " + (ans.get(0) + 1)

                           + " has max sum " + ans.get(1));

    }

}

Python3

import sys

N = 5 

def colMaxSum(mat):

    idx = -1

    maxSum = -sys.maxsize

    for i in range(0, N):

        sum = 0

        for j in range(0, N):

            sum += mat[i][j]

        if (sum > maxSum):

            maxSum = sum

            idx = i

    res = [idx, maxSum]

    return res

mat = [[1, 2, 3, 4, 5],

       [5, 3, 1, 4, 2],

       [5, 6, 7, 8, 9],

       [0, 6, 3, 4, 12],

       [9, 7, 12, 4, 3]]

ans = colMaxSum(mat)

print("Row", ans[0] + 1, "has max sum", ans[1])

C#

using System;

using System.Collections.Generic;

public class MaxSum {

    public static int N;

    static List<int> colMaxSum(int[, ] mat)

    {

        int idx = -1;

        int maxSum = int.MinValue;

        for (int i = 0; i < N; i++) {

            int sum = 0;

            for (int j = 0; j < N; j++) {

                sum += mat[i, j];

            }

            if (maxSum < sum) {

                maxSum = sum;

                idx = i;

            }

        }

        List<int> res = new List<int>();

        res.Add(idx);

        res.Add(maxSum);

        return res;

    }

    public static void Main(String[] args)

    {

        N = 5;

        int[, ] mat = {

            { 1, 2, 3, 4, 5 },  { 5, 3, 1, 4, 2 },

            { 5, 6, 7, 8, 9 },  { 0, 6, 3, 4, 12 },

            { 9, 7, 12, 4, 3 },

        };

        List<int> ans = colMaxSum(mat);

        Console.WriteLine("Row " + (ans[0] + 1)

                          + " has max sum " + ans[1]);

    }

}

Javascript

<script>

var N;

function colMaxSum(mat)

{

    var idx = -1;

    var maxSum = -1000000000;

    for (var i = 0; i < N; i++)

    {

        var sum = 0;

        for (var j = 0; j < N; j++)

        {

            sum += mat[i][j];

        }

        if (maxSum < sum)

        {

            maxSum = sum;

            idx = i;

        }

    }

    var res = [];

    res.push(idx);

    res.push(maxSum);

    return res;

}

N = 5;

var mat = [

    [ 1, 2, 3, 4, 5 ],

    [ 5, 3, 1, 4, 2 ],

    [ 5, 6, 7, 8, 9 ],

    [ 0, 6, 3, 4, 12],

    [ 9, 7, 12, 4, 3]];

var ans = colMaxSum(mat);

document.write("Row "+ (ans[0]+1)+ " has max sum "

+ ans[1]);

</script>

Output

Row 3 has max sum 35

Time complexity: O(N2)
Auxiliary space: O(1)

Example in c:

Approach:

Initialize a variable max_sum to zero and a variable max_row to -1.

Traverse the matrix row by row:

a. Initialize a variable row_sum to zero.

b. Traverse the elements of the current row and add them to row_sum.

c. If row_sum is greater than max_sum, update max_sum to row_sum and max_row to the current row.

Return max_row.

C

#include <stdio.h>

int main()

{

    int mat[3][4] = { { 1, 2, 3, 4 },

                      { 5, 6, 7, 8 },

                      { 9, 10, 11, 12 } };

    int m = 3;

    int n = 4;

    int max_sum = 0;

    int max_row = -1;

    for (int i = 0; i < m; i++) {

        int row_sum = 0;

        for (int j = 0; j < n; j++) {

            row_sum += mat[i][j];

        }

        if (row_sum > max_sum) {

            max_sum = row_sum;

            max_row = i;

        }

    }

    printf("Row with maximum sum is: %dn", max_row);

    return 0;

}

C++

#include <iostream>

using namespace std;

int main()

{

    int mat[3][4] = { { 1, 2, 3, 4 },

                      { 5, 6, 7, 8 },

                      { 9, 10, 11, 12 } };

    int m = 3;

    int n = 4;

    int max_sum = 0;

    int max_row = -1;

    for (int i = 0; i < m; i++) {

        int row_sum = 0;

        for (int j = 0; j < n; j++) {

            row_sum += mat[i][j];

        }

        if (row_sum > max_sum) {

            max_sum = row_sum;

            max_row = i;

        }

    }

    cout << "Row with maximum sum is: " << max_row << endl;

    return 0;

}

Java

class Main {

    public static void main(String[] args)

    {

        int[][] mat = { { 1, 2, 3, 4 },

                        { 5, 6, 7, 8 },

                        { 9, 10, 11, 12 } };

        int m = 3;

        int n = 4;

        int max_sum = 0;

        int max_row = -1;

        for (int i = 0; i < m; i++) {

            int row_sum = 0;

            for (int j = 0; j < n; j++) {

                row_sum += mat[i][j];

            }

            if (row_sum > max_sum) {

                max_sum = row_sum;

                max_row = i;

            }

        }

        System.out.println("Row with maximum sum is: "

                           + max_row);

    }

}

Python3

mat = [[1, 2, 3, 4],

       [5, 6, 7, 8],

       [9, 10, 11, 12]]

m = 3

n = 4

max_sum = 0

max_row = -1

for i in range(m):

    row_sum = 0

    for j in range(n):

        row_sum += mat[i][j]

    if row_sum > max_sum:

        max_sum = row_sum

        max_row = i

print("Row with maximum sum is: ", max_row)

Javascript

let mat = [[1, 2, 3, 4],

           [5, 6, 7, 8],

           [9, 10, 11, 12]];

let m = 3;

let n = 4;

let max_sum = 0;

let max_row = -1;

for (let i = 0; i < m; i++) {

    let row_sum = 0;

    for (let j = 0; j < n; j++) {

        row_sum += mat[i][j];

    }

    if (row_sum > max_sum) {

        max_sum = row_sum;

        max_row = i;

    }

}

console.log("Row with maximum sum is: ", max_row);

C#

using System;

class GFG {

    public static void Main(string[] args)

    {

        int[][] mat

            = new int[][] { new int[] { 1, 2, 3, 4 },

                            new int[] { 5, 6, 7, 8 },

                            new int[] { 9, 10, 11, 12 } };

        int m = 3;

        int n = 4;

        int max_sum = 0;

        int max_row = -1;

        for (int i = 0; i < m; i++) {

            int row_sum = 0;

            for (int j = 0; j < n; j++) {

                row_sum += mat[i][j];

            }

            if (row_sum > max_sum) {

                max_sum = row_sum;

                max_row = i;

            }

        }

        Console.WriteLine("Row with maximum sum is: "

                          + max_row);

    }

}

Output

Row with maximum sum is: 2

time complexity of O(mn) 

 space complexity of O(n)

Last Updated :
12 Apr, 2023

Like Article

Save Article

Перейти к содержанию

Найти столбец матрицы с максимальной суммой элементов

Просмотров 5.5к. Обновлено 29 октября 2021

Для решения данной задачи необходимо найти сумму элементов каждого столбца матрицы, после чего сравнить между собой суммы. При этом надо запомнить, какому столбцу принадлежит какая сумма.

Однако не будем сначала искать все суммы, а после выполнять сравнений. Вычислив сумму элементов очередного столбца, сравним ее со значением переменной, предназначенной для хранения максимальной суммы. Если текущая окажется больше, то запишем ее в указанную переменную. Кроме того, запомним в отдельной переменной номер текущего столбца.

Если сумма следующего столбца окажется больше, то снова перезапишем указанные переменные. Если же меньше или равна, то перезаписывать не будем.

Перебрав таким образом всю матрицу, мы найдем столбец с максимальной суммой элементов. Но только первый. Данный вариант решения задачи приводится в примерах кода ниже.

Если же в матрице содержится несколько столбцов с одинаковой максимальной суммой и все их надо определить, то задача решается немного по-другому. Сначала ищется максимум, при этом номер столбца запоминать не надо. После этого снова считаются суммы столбцов и при совпадении с ранее найденным максимальным значением номер столбца выводится на экран.

Pascal

Язык Си

Python

КуМир

Basic-256

В
задачах подобного вида результатом
является единственное значение. Поэтому
начальные значения вычисляемым переменным
присваиваются
один раз — в начале алгоритма,
до организации циклов обработки
элементов массива. На
рис. 24 показан алгоритм вычисления
суммы элементов матрицы. Начальное
значение сумме
S=0
присваивается
до начала суммирования
элементов.
Затем обработка
элементов
массива
идёт по тому же
принципу, что и в предыдущем
пункте.

S:=0;

for
i:=1 to N do

for
j:=1 to M do

S
:= S+X[i,j];

writeln(‘S=
‘,S);


Рис. 24

Т
акже
рассуждаем и при нахождении максимального
элемента матрицы
(рис. 25).
В качестве начального
значения максимума
принимаем
её первый элемент,
в качестве начальных значений координат
максимума — единицы. Затем поочерёдно
сравниваем максимум со всеми элементами
матрицы построчно и запоминаем координаты
вновь принятого
за максимум элемента. При завершении
обоих циклов максимум считается
окончательно найденным и может быть
обработан
по условию задачи. Ниже приведены
фрагменты программ,
иллюстрирующие рис. 25.

MAX
:= X[1,1];

Imax:=1;

Jmax:=1;

For
I:=1 to N do

For
j:=1 to M do

If
MAX < X[I,j] then

Begin

MAX:=
X[I,j];

Imax
:=I;

Jmax
:= j;

End;

Writeln(‘max=
‘,MAX);

Рис. 25

3.2.3. Нахождение суммы, произведения, максимума в каждой строке матрицы

При
решении задач подобного типа
в ответе получается столько же
значений, сколько в матрице строк.
Поэтому начальные значения
вычисляемым переменным присваиваем
при каждом переходе к
обработке следующей строки, т.е.
между циклами. Результат для каждой
строки также окончательно вычислен
при завершении каждой строки и может
быть обработан по условию задачи между
циклами (после
завершения цикла j).

На
рис. 26 представлен алгоритм
нахождения суммы элементов каждой
строки матрицы X
и
вывод этих сумм на экран. Ниже приведены
фрагменты программ, иллюстрирующие
этот алгоритм.

for
i:=1 to N do

begin

S:=0;

for
j: =1 to M do

S:=S+X[
i , j ];

writeln(‘S=

,
S);

end;

Рис. 26

На
рис. 27 приведён алгоритм вычисления
максимума каждой строки матрицы X
и
замена
его нулём.

for
i:=l to N do

begin

MAX:=X[i,1]
; Jmax:=1;

for
j:=2 to M do

if
X[I,j] > MAX then

begin

MAX:=X[i,j];Jmax:=j
end;
X[i,Jmax] :=0;

end;

Рис.27

3.2.4. Алгоритм обработки элементов каждого столбца

При
решении задач подобного типа в ответе
получается столько
же значений, сколько в матрице столбцов.
В качестве примера
на рисунке 28 приведён алгоритм увеличения
в 2 раза
максимальных элементов столбцов матрицы
X.
Комментарии
к этому алгоритму аналогичны комментариям
к предыдущему
пункту. Ниже приведён фрагмент программы
к этому алгоритму.

f

or
j:=1 to M do

begin

МАХ:=Х[1,j];

Imax:=1;

for
i:=2 to N do if MAX<X[i,j] then

begin

MAX:=X[i,j];

Imax:=
i;

end;

X
[Imax, j ]: =X [Imax, j ] *2;

end;

… Рис.28

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]

  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #
  • #

Понравилась статья? Поделить с друзьями:
  • Грузчики как найти клиентов
  • Как найти символы кириллицы на телефоне
  • Как найти в аппсторе обновления
  • Как найти сайт вацап
  • Треснул шов на гипсокартоне как исправить