Динамічне програмування - проблеми, пов’язані з Grids HackerEarth

Ми бажаємо про конфіденційність ваших даних. HackerEarth використовує надану Вами інформацію для надання Вам актуального вмісту, продуктів та послуг.

динамічне

Наша політика конфіденційності та використання послуг, що допомогли вам зрозуміти, як ви контролюєте свої дані на HackerEarth.

Зареєструйтесь та отримайте безкоштовний доступ до 100+ підручників та практичних завдань Начать

1. Вступ

У конкурсах кодування в Інтернеті є багато проблем, які передбачають пошук шляху із мінімальною вартістю в сітці, пошук кількості способів досягти певної позиції з певної вихідної точки у двовимірній сітці тощо. Цей пост намагається розглянути підхід динамічного програмування для вирішення цих проблем. Тут будуть розглянуті такі проблеми:

2. Пошук шляху мінімальних витрат у 2-D матриці

Постановка проблеми: Враховуючи матрицю витрат Cost [] [], де Cost [i] [j] позначає вартість відвідування комірки з координатами (i, j), знайдіть шлях мінімальної вартості, щоб дістатися до комірки (x, y) з комірки ( 0,0) за умови, що ви можете пройти лише один крок праворуч або один крок вниз. (Ми вважаємо, що всі витрати є натуральними числами)

Рішення: Дуже легко зауважити, що якщо ви досягли положення (i, j) у сітці, ви, мабуть, прибули з однієї клітинки вище, тобто (i-1, j), або з однієї комірки ліворуч, тобто (i, j-1). Це означає, що вартість відвідування комірки (i, j) буде походити від наступного відношення рецидиву:

Наведене вище твердження означає, що для досягнення комірки (i, j) з мінімальною вартістю спочатку досягайте комірки (i-1, j) або комірки (i, j-1) з якомога мінімальними витратами. Звідти перейдіть до комірки (i, j). Це підводить нас до двох важливих умов, які необхідно виконати для динамічної проблеми програмування:

Оптимальна підструктура: - Оптимальне вирішення проблеми передбачає оптимальне вирішення підзадачі.

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

(Ви можете погуглити вищезазначені два терміни, щоб отримати докладнішу інформацію)

Проблема пошуку шляху мінімальних витрат зараз майже вирішена. Тепер ми обчислюємо значення базових випадків: верхній рядок і крайній лівий стовпець. Для верхнього рядка до комірки можна дістатися лише з комірки ліворуч від неї. Припускаючи нульовий індекс,

тобто вартість досягнення осередку (0, j) = Вартість досягнення осередку (0, j-1) + Вартість відвідування осередку (0, j) Аналогічним чином,

тобто вартість досягнення осередку (i, 0) = Вартість досягнення осередку (i-1,0) + Вартість відвідування осередку (i, 0)

З них можна обчислити інші значення. Дивіться код нижче для більш детального розуміння.

Інший варіант цієї проблеми включає інший напрямок руху, тобто також дозволяється переміщатися по діагоналі нижче від комірки (i, j) до комірки (i + 1, j + 1). Це питання також можна легко вирішити за допомогою невеликої модифікації відношення рецидивів. Щоб досягти (i, j), спочатку потрібно досягти або (i-1, j), (i, j-1) або (i-1, j-1).

2. Знайти кількість способів дістатися з вихідної позиції до кінцевої, рухаючись лише у визначених напрямках.

Постановка проблеми: Отримавши двовимірну матрицю з M рядками та N стовпцями, знайдіть кількість способів досягти комірки з координатами (i, j) з початкової комірки (0,0) за умови, що ви можете пройти лише один крок праворуч або один Крок вниз.

Рішення: Ця проблема дуже схожа на попередню. Щоб дістатися до комірки (i, j), потрібно спочатку дістатися або до комірки (i-1, j), або до комірки (i, j-1), а потім рухатися на один крок вниз або вправо, щоб досягти комірки (i, j). Переконавшись у тому, що ця проблема справді задовольняє оптимальній підструктурі та властивостям підпроблем, що перекриваються, ми намагаємось сформулювати рішення динамічного програмування знизу вгору.

Спочатку нам потрібно визначити стани, від яких буде залежати рішення. Щоб знайти кількість способів досягти певної позиції, від яких змінних залежить моя відповідь? Тут нам потрібен номер рядка та стовпця, щоб однозначно визначити позицію. Детальніше про те, як визначити стан рішення динамічного програмування, дивіться тут: Як можна почати вирішувати проблеми динамічного програмування? Отже, нехай NumWays (i, j) - це кількість способів досягти позиції (i, j). Як зазначено вище, кількість шляхів досягнення комірки (i, j) буде дорівнює сумі кількості шляхів досягнення (i-1, j) та кількості шляхів досягнення (i, j-1). Таким чином, ми маємо відношення рецидиву як:

Тепер все, що вам потрібно зробити, це подбати про базові випадки, і відношення повторення обчислить решту для вас.:)

Основним випадком, як і в попередньому питанні, є верхній рядок і крайній лівий стовпець. Тут кожну комірку у верхньому рядку можна відвідати лише одним способом, тобто з лівої комірки. Подібний випадок для крайньої лівої колонки. Звідси код:

3. Знаходження кількості способів досягти певної позиції в сітці з вихідної позиції (враховуючи деякі клітинки, які заблоковані)

Постановка проблеми: Ви можете прочитати заяву про проблему тут: Введення роботів та шляхів - це цілі числа M, N та P, що позначають кількість рядків, кількість стовпців та кількість заблокованих комірок відповідно. У наступних Р рядках кожен рядок має рівно 2 цілих числа i і j, що означає, що комірка (i, j) заблокована.

Рішення: У наведеному нижче коді пояснено, як діяти із рішенням. Проблема така ж, як і попередня, за винятком кількох додаткових перевірок (через заблоковані клітинки.)

Інший варіант

Нарешті, ми обговоримо ще один варіант проблем, пов’язаних із сітками. Ви можете побачити проблему тут. Розробка Короткий опис проблеми:

Постановка проблеми: Вам надається двовимірна матриця A з n рядків і m стовпців, де A [i] [j] позначає спалені калорії. Дві особи, хлопчик і дівчинка, починають з двох кутів цієї матриці. Хлопчик починає з осередку (1,1) і повинен дістатися до осередку (n, m). З іншого боку, дівчина починає з клітини (n, 1) і їй потрібно досягти (1, m). Хлопчик може рухатися вправо і вниз. Дівчина може рухатися вправо і вгору. Коли вони відвідують клітину, кількість клітини A [i] [j] додається до загальної кількості спалених калорій. Ви повинні максимізувати суму загальної кількості спалених калорій обома за умови, що вони повинні задовольнятись лише в одній камері, і вартість цієї клітини не включатиметься до жодної із загальних калорій.

Рішення: Давайте проаналізуємо цю проблему поетапно:

Хлопчик може зустріти дівчину лише в одній камері.

Отже, припустимо, що вони зустрічаються в камері (i, j).

Хлопчик може зайти зліва або зверху, тобто (i, j-1) або (i-1, j). Тепер він може рухатися вправо або вниз, тобто послідовність для хлопчика може бути такою:

Так само дівчина може зайти зліва або знизу, тобто (i, j-1) або (i + 1, j), і вона може піднятися вгору або праворуч. Послідовність руху дівчинки може бути такою:

Порівнюючи 4 послідовності хлопчика і дівчинки, хлопчик і дівчинка зустрічаються лише в одній позиції (i, j), iff

Переконайтесь, що в жодному іншому випадку вони не зустрінуться лише на одній позиції.

Тепер ми можемо вирішити проблему, створивши 4 таблиці:

  1. Подорож хлопчика від початку (1,1) до камери (i, j)
  2. Подорож хлопчика від комірки (i, j) до кінця (n, m)
  3. Подорож дівчини від початку (n, 1) до мітингу (i, j)
  4. Подорож дівчини від наради (i, j) до кінця (1, n)

Осередок зустрічі може становити від 2

Докладніше див. У коді нижче:

Дякуємо за читання.:) Сподіваюся, це було корисно!