Để tìm ma trận con có tổng nhỏ nhất trong một ma trận hai chiều trong C#, bạn có thể sử dụng một phương pháp tương tự như thuật toán Kadane hai chiều, nhưng thay vì tìm tổng lớn nhất, bạn sẽ tìm tổng nhỏ nhất.
Cách thực hiện:
- Khởi tạo ma trận hai chiều.
- Sử dụng thuật toán Kadane hai chiều để tìm ma trận con có tổng nhỏ nhất.
Dưới đây là mã nguồn minh họa:
using System;
class Program
{
static void Main()
{
int[,] matrix = {
{ 1, 2, -1, -4, -20 },
{ -8, -3, 4, 2, 1 },
{ 3, 8, 10, 1, 3 },
{ -4, -1, 1, 7, -6 }
};
int rows = matrix.GetLength(0);
int cols = matrix.GetLength(1);
int minSum = int.MaxValue;
int left = 0, right = 0, top = 0, bottom = 0;
for (int leftCol = 0; leftCol < cols; leftCol++)
{
int[] temp = new int[rows];
for (int rightCol = leftCol; rightCol < cols; rightCol++)
{
for (int i = 0; i < rows; i++)
{
temp[i] += matrix[i, rightCol];
}
var kadaneResult = Kadane(temp);
int currentSum = kadaneResult.Item1;
int startRow = kadaneResult.Item2;
int endRow = kadaneResult.Item3;
if (currentSum < minSum)
{
minSum = currentSum;
left = leftCol;
right = rightCol;
top = startRow;
bottom = endRow;
}
}
}
Console.WriteLine($"Ma trận con có tổng nhỏ nhất là: {minSum}");
Console.WriteLine($"Vị trí: Từ hàng {top} đến hàng {bottom}, từ cột {left} đến cột {right}");
}
static Tuple<int, int, int> Kadane(int[] array)
{
int minSum = array[0], currentSum = array[0];
int start = 0, end = 0, tempStart = 0;
for (int i = 1; i < array.Length; i++)
{
if (currentSum + array[i] > array[i])
{
currentSum = array[i];
tempStart = i;
}
else
{
currentSum += array[i];
}
if (currentSum < minSum)
{
minSum = currentSum;
start = tempStart;
end = i;
}
}
return new Tuple<int, int, int>(minSum, start, end);
}
}
Giải thích:
- Khởi tạo ma trận hai chiều: Ma trận
matrix
được khởi tạo với các giá trị. - Thuật toán Kadane hai chiều:
- Biến
temp
: Mảng tạm thời để lưu tổng của các phần tử trong một dải cột. - Biến
minSum
: Lưu tổng nhỏ nhất tìm được. - Các biến
left
,right
,top
,bottom
: Lưu vị trí của ma trận con có tổng nhỏ nhất. - Vòng lặp
leftCol
vàrightCol
: Duyệt qua từng cặp cột để tính tổng của dải cột. - Hàm
Kadane
: Tìm mảng con có tổng nhỏ nhất trong dải cột hiện tại. - **Cập nhật
minSum
và vị trí ma trận con nếu tổng hiện tại nhỏ hơnminSum
.
- Biến
Comments