Из LeetCode
Учитывая строку S и строку T, подсчитайте количество различных подпоследовательностей T в S.
Подпоследовательность строки - это новая строка, которая формируется из исходной строки путем удаления некоторых (не может быть ни одного) символов без нарушения относительного положения оставшихся символов. (то есть "ACE" является подпоследовательностью "ABCDE", а "AEC" - нет).
Вот пример: S = "Кролик", T = "Кролик"
Вернуть 3.
Я вижу очень хорошее решение для DP, но мне трудно понять, кто-нибудь может объяснить, как работает этот dp?
int numDistinct(string S, string T) {
vector<int> f(T.size()+1);
//set the last size to 1.
f[T.size()]=1;
for(int i=S.size()-1; i>=0; --i){
for(int j=0; j<T.size(); ++j){
f[j]+=(S[i]==T[j])*f[j+1];
printf("%d\t", f[j] );
}
cout<<"\n";
}
return f[0];
}