Свести к минимуму затраты на покрытие пола плиткой размером 1*1 и 1*2.

Опубликовано: 22 Сентября, 2022

Дан двумерный массив arr[][] размера N*M , состоящий из '.' и '*', представляющие пол, и два положительных целых числа A и B , представляющие стоимость плитки 1*1 и 1*2 соответственно, задача состоит в том, чтобы заполнить все символы, имеющие '.' на полу плиткой размером 1*1 или 1*2 таким образом, чтобы затраты на заливку пола были минимальны и не допускалось переворачивание плитки.

Примеры:

Input: A = 2, B = 10, arr[][] = {{‘.’, ‘.’, ‘*’},  {‘.’, ‘*’, ‘*’}}
Output: 6
Explanation:
Cover arr[0][0] with 1*1 tile, arr[0][1] with 1*1 tile and arr[1][0] with 1*1 tile.
Therefore, the minimum cost is 2 + 2 +2 = 6.

Input: A = 2, B = 6, arr[][] = {{‘.’, ‘.’, ‘.’}, {‘*’, ‘*’, ‘.’}, {‘.’, ‘.’, ‘*’}}
Output: 12

Подход: Данная проблема может быть решена с использованием жадного подхода. Идея состоит в том, чтобы пройти по заданному 2D-массиву построчно, и если два последовательных '.' встречается, затем выберите плитку с минимальной стоимостью размещения двух плиток 1 * 1 или одной плитки 1 * 2 . Выполните следующие шаги, чтобы решить проблему:

  • Инициализируйте переменную, скажем , как 0 , чтобы сохранить минимальную общую стоимость.
  • Пройдите по заданному 2D-массиву arr[][] по строкам, используя i для индекса строки и j для индекса столбца, и выполните следующие шаги:
    • Если значение arr[i][j] равно '*' , то продолжаем итерацию.
    • В противном случае проверьте следующие условия:
      • Если значение j равно m(M – 1) , то добавьте A к переменной ans .
      • В противном случае, если значение (arr[i][j + 1]) равно '.' , затем добавьте минимум значений 2*A и B к переменной ans .
      • Во всех остальных случаях добавьте значение A к переменной ans .
  • После выполнения вышеуказанных шагов выведите в качестве результата значение ans .

Ниже приведена реализация вышеуказанного подхода:

Временная сложность: O(N * M)
Вспомогательное пространство: O(1)