Это почти то же самое, что и DP минус часть memoization.
LCS(s1, s2, i, j):
if(i == -1 || j == -1)
return 0
if(s1[i] == s2[j])
return 1 + LCS(s1, s2, i-1, j-1)
return max(LCS(s1, s2, i-1, j), LCS(s1, s2, i, j-1))
Идея заключается в том, если у нас есть две строки s1 и s2, где s1 заканчивается я и s2 заканчивается у, то ЛВП:
- если либо строка пуста, то длинный общий подпоследовательность равна 0.
- Если последний символ (индекс i) строки 1 совпадает с последним в строке 2 (индекс j), тогда ответ равен 1 плюс LCS s1 и s2, заканчивающийся на i-1 и j-1 соответственно. Потому что очевидно, что эти два индекса вносят вклад в LCS, поэтому их оптимально подсчитывать.
- Если последние символы не совпадают, мы пытаемся удалить один из символов. Поэтому мы пытаемся найти LCS между s1 (заканчивающийся на i-1) и s2 (заканчивающийся на j) и LCS между s1 (заканчивающийся на i) и s2 (заканчивающийся на j-1), а затем взять максимум обоих.
Временная сложность, очевидно, экспоненциальная.
Когда вы получаете нетривиальные ответы, пожалуйста, подумайте о том, чтобы ответить на них или, по крайней мере, отложить их за их усилия. Ответ от MooseBoys, похоже, остался незамеченным. – halfer