很奇怪的动态规划公式,网上的解释都很不清楚,我研究了半天,详细解释一下吧
例子:T:rab S:rabb
那么当S[ j ] == T[ i ]时,动态规划公式用实际情况表达出来就是:
dp[i][j] = dp[i][j-1] + dp[i-1][j-1]
T: rab rab ra
S; rabb rab rab
从第一个字符串变换到第二个字符串,如果当前S[i]==T[j],那么当前这个字母即可以保留也可以抛弃,所以变换方法等于保留这个字母的变换方法加上不用这个字母的变换方法。
class Solution {
public:
int numDistinct(string s, string t) {
int m = t.length(), n = s.length();
vector<vector<int>> dp(m + 1, vector<int> (n + 1, 0));
for (int j = 0; j <= n; j++) dp[0][j] = 1;
for (int j = 1; j <= n; j++)
for (int i = 1; i <= m; i++)
dp[i][j] = dp[i][j - 1] + (t[i - 1] == s[j - 1] ? dp[i - 1][j - 1] : 0);
return dp[m][n];
}
};