Подсчет строк с использованием динамического программирования - PullRequest
0 голосов
/ 10 июля 2019

Дана строка s, состоящая из букв в верхнем регистре, то есть от «A» до «Z». Мы должны найти, сколько строк t с длиной, равной s, также состоящей из алфавитов верхнего регистра, удовлетворяют ли следующим условиям:

  • Строка t лексикографически больше строки s.
  • Когда вы пишете s и t в обратном порядке, t все еще лексикографически больше s.

Узнайте количество таких строк t. Это решение, которое я нашел в конкретной статье, используя dp:

Пусть F [i] [ok1] [ok2] - это число строк T, которые мы можем сгенерировать, если мы уже получили первые символы i-1, а ok1 и ok2 представляют следующую информацию:

ok1 = 0 означает, что первые i - 1 символов T по-прежнему совпадают с соответствующими t - 1 символами S. ok1 = 1 означает, что T больше S. ok2 = 0 означает, что в обратном порядке первые t - 1 символов в T уже лексикографически больше, чем соответствующие символы в S. ok2 = 0, если в противном случае.
Пусть N длина S. Результат, конечно, будет F [0] [0] [0]. Мы можем инициализировать dp с F [N + 1] [1] [1] = 1. Мы будем вычислять F в порядке убывания i. С каждым i, ok1, ok2 мы пытаемся поместить все возможные символы в положение i, чтобы T никогда не было лексикографически меньше, чем S в исходном порядке:

//let s is 0-indexed
for (int i = N - 1; i > 0; i--)
    for (int ok1 = 0; ok1 <= 1; ok1++)
      for (int ok2 = 0; ok2 <= 1; ok2++) {
      //make sure that T is always lexicographically larger than S in original order
        for (char c = ok1 == 0 ? s* : 'A'; c <= 'Z'; c++) {
          int nextOk2 = ok2;
          if (c != s[pos]) {
            //if we put a character c > s[pos] in position pos of T then T became lexicographically larger than S in reversed order
            nextOk2 = c > s[pos];
          }
      f[pos][ok1][ok2] = (f[pos][ok1][ok2] + f[pos + 1][ok1 || c > s[pos]][nextOk2]) % MOD;
    }
  }

Сложность будет O (N × 2 × 2 × 26).

  • Чего я не понимаю, так это почему F [N + 1] [1] [1] = 1?
  • Кроме того, почему окончательный ответ хранится в F [0] [0] [0]?
  • Может кто-нибудь дать хорошее объяснение вышеприведенного алгоритма на небольшом примере?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...