Дана строка 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]?
- Может кто-нибудь дать хорошее объяснение вышеприведенного алгоритма на небольшом примере?