1. Количество маршрутов в прямоугольной таблице

☰ Теория

Двумерное динамическое программирование

 
Двумерное динамическое программирование (2D DP) - это метод решения задач, которые имеют два изменяемых параметра и часто используются для оптимизации.

Рассмотрим этот метод на примере задачи о нахождении минимального пути в сетке.

Задача
В левом верхнем углу прямоугольной сетки размером NxM расположен робот. Он хочет добраться до правого нижнего угла. При этом, он может передвигаться только на одну клетку вниз или на одну клетку вправо. Найдите количество различных путей, по которым робот может попасть в правый нижний угол.



Будем решать задачу, используя план решения задач на динамическое программирование:
1) Решим задачу для маленьких значений
- Если сетка состоит только из 1 строки, то количество путей, попасть в любую клетку равно одному (a1,m = 1).

- Если сетка состоит из 1 столбца, то количество способов также будет равно одному (an,1 = 1).

- если сетка 2x2, то количество путей будет равно двум. Каждый вариант указан стрелкой на рисунке.


2. Введем обозначение:  ai,j- количество различных путей попасть из клетки с координатой (1, 1) в клетку с координатой (i, j).

3. Составим рекуррентную формулу для вычисления ai,j.
Если рассмотреть движение робота по сетке, то можно увидеть, что попасть в клетку с координатой (i, j) можно лишь двумя способами: из клетки с координатой (i, j-1), двигаясь из нее вправо и из клетки с координатой (i-1, j), двигаясь из нее вниз.
Получается наша рекуррентная формула имеет вид:

ai,j = ai,j-1 + ai-1,j


4) Ограничения на формулу
Формула работает для всех i > 1, j > 1 (при нумерации столбцов и строк, начиная с 1).

5) Определим порядок обхода таблицы NxM.
В данном случае порядок обхода можно выполнить следующим образом:
- заполнить сначала первую строку и первый столбец единицами;
- заполнить остальную таблицу, используя рекуррентную формулу.

6) Определим, где находится ответ.
Ответ будет находится в правой нижней клетке таблицы, то есть an,n
 

В прямоугольной таблице NxM в левой верхней клетке стоит шашка. За один ход разрешается переместить шашку в соседнюю клетку либо вправо, либо вниз (влево и вверх перемещаться запрещено). Посчитайте, сколько есть вариантов переместить шашку в правую нижнюю клетку.


Входные данные
Вводятся два числа N и M - размеры таблицы (1<=N<=10, 1<=M<=10).

Выходные данные
Выведите искомое количество вариантов.
 
Примеры
Входные данные Выходные данные
1 2 3 3


 

Напишите программу
Auto
       

time 1000 ms
memory 256 Mb
Правила оформления программ и список ошибок при автоматической проверке задач

Статистика успешных решений по компиляторам
 Кол-во
С++ Mingw-w6432
Python288
Комментарий учителя