Постановка задачи такова: даны две последовательности A и B, подсчитайте количество уникальных способов в последовательности A, чтобы сформировать подпоследовательность, идентичную последовательности B. Подпоследовательность: подпоследовательность строки ...

1
Karan Yogi 16 Янв 2021 в 12:54

1 ответ

Лучший ответ
  • Пусть A имеет длину L1, а B - длину L2.
  • Пусть f (i, j) будет функцией, которая дает вам количество способов получить последовательность B (j ... L2-1) из последовательности A (i ... L1-1), а затем ответ на ваша проблема будет f (0,0).
  • Обратите внимание, что последовательность A (i ... L1-1) означает подстроку A (i ... L1-1), а B (j ... L2-1) означает подстроку B (j ... L2 -1).

Вот код, написанный на C ++:

int memo[100][100];
string A, B;

int f(int i, int j) {
    if (i >= A.length() || j >= B.length()) return 0;
    if (A[i] == B[j]) {
        if (j == B.length() - 1)
            memo[i][j] = 1 + f(i + 1 , j);
        else
            memo[i][j] = f(i + 1, j + 1) + f(i + 1, j);
    }
    else {
        memo[i][j] = f(i + 1, j);
    }
    return memo[i][j];
}
1
VFX 17 Янв 2021 в 04:55