1035. Uncrossed Lines
Содержание
Условие задачи
Кто-то записал целые числа в две горизонтальные линии ( в первую линию из массива A
, во вторую – из B
).
Теперь можно соединить цифры из разных горизонтальных линий линиями, так что A[i] == B[j]
Соединим цифры линиями так, что бы линии не пересекались.
Необходимо вернуть максимальное количество нарисованных линий, так что бы они не пересекались.
пример 1
|
|
пример 2
|
|
пример 3
|
|
Ограничения
- 1 <=
len(A)
<= 500 - 1 <=
len(B)
<= 500 - 1 <=
A[i], B[i]
<= 2000
Решение
Динамика
Идея решения через динамическое программирование такая:
- берем две самые правые точки на основных линиях ( цифры с массивов
A
иB
индексi
,j
) - если две текущих точки совпадают по значению – значит можно провести линию непересекающую все остальные – :
- запускаем функцию динамического программиррования для
i-1
,j-1
и возвращаем её результат + 1
- запускаем функцию динамического программиррования для
- если не совпадают:
- запускаем функцию динамического программиррования для
i
,j-1
- запускаем функцию динамического программиррования для
i-1
,j
- возвращаем максимум от вызовы этих функций
- запускаем функцию динамического программиррования для
- если хоть один из индексов меньше 0 – возвращаем ноль
|
|