×

Tìm ma trận con có tổng nhỏ nhất trong C#

Để 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:

  1. Khởi tạo ma trận hai chiều.
  2. 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 leftColrightCol: 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ơn minSum.

Comments