不同的子序列
链接
https://leetcode-cn.com/problems/distinct-subsequences/
代码
class Solution {
public:
int numDistinct(string s, string t) {
int m = s.size();
int n = t.size();
vector<vector<long>> dp(m+1, vector<long>(n+1, 0));
for(int i = 0; i <= m; i++){
dp[i][0] = 1;
}
for(int i = 1; i <= n; i++){
dp[0][i] = 0;
}
for(int i = 1; i < m+1; i++){
for(int j = 1; j < n+1; j++){
if(s[i-1] == t[j-1]){
dp[i][j] = dp[i-1][j-1] + dp[i-1][j];
}else{
dp[i][j] = dp[i-1][j];
}
}
}
return dp[m][n];
}
};
总结
动态规划的关键就是转移方程和边界条件以及初始化的设置。
本题的转移方程比较简单,但有代表性——根据每一个读入的字符进行状态的转移。
在空间上仍有优化空间。