Cho ma trận M[row][col]. Tìm hiệu lớn nhất giữa tổng 2 hàng bất kỳ, trong đó hàng thứ 2 có chỉ số lớn hơn hàng thứ 1 (y > x).
Ví dụ
Đầu vào
M[4][4] = {
{ 1, 2, 0, 5 },
{ 0, 1, 1, 0 },
{ 7, 2, 3, 2 },
{ 1, 2, 4, 1 }
}
Đầu ra - Hiệu tối đa: 12
Giải thích - Hàng 2 (chỉ số 2): tổng = 14. Hàng 1 (chỉ số 1): tổng = 2. Hiệu = 14-2 = 12.
Đầu vào
M[4][4] = {
{ 0, 2, 0, 5 },
{ 0, 1, 4, 0 },
{ 1, 2, 3, 2 },
{ 2, 2, 6, 0 }
}
Đầu ra - Hiệu tối đa: 5
Phương pháp
- Tính tổng từng hàng lưu vào mảng RSum[]
- Khởi tạo MD = RSum[1] - RSum[0], MIN = RSum[0]
- Duyệt i từ 1 đến row-1:
- Nếu RSum[i] - MIN > MD → cập nhật MD
- Nếu RSum[i] < MIN → cập nhật MIN
- Trả về MD
Chương trình mẫu
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
int rowmaxd(int M[][MAX], int row, int col) {
int RSum[row];
for (int i = 0; i < row; i++) {
int sum = 0;
for (int j = 0; j < col; j++)
sum += M[i][j];
RSum[i] = sum;
}
int MD = RSum[1] - RSum[0];
int MIN = RSum[0];
for (int i = 1; i < row; i++) {
if (RSum[i] - MIN > MD)
MD = RSum[i] - MIN;
if (RSum[i] < MIN)
MIN = RSum[i];
}
return MD;
}
int main() {
int r = 5, c = 4;
int mat[][MAX] = {
{-1, 2, 3, 4},
{6, 3, 0, 1},
{-1, 7, 8, -3},
{3, 5, 1, 4},
{2, 1, 1, 0}
};
printf("Hiệu tối đa tổng 2 hàng: %d", rowmaxd(mat, r, c));
return 0;
}
Kết quả
Hiệu tối đa tổng 2 hàng: 5