状态转移方程:dp[i][j] = sum(dp[i-1][0],...,dp[i-1][j-1]);
还可以继续优化,可以用空间换时间,减少求解dp[i][j]的查询数量,
贴出代码,请大佬给出更优的算法,以此共勉!

class Solution {
public:
    int numDistinct(string S, string T) {
        int ans = 0, n = S.size(), m = T.size();
        vector<vector<int> > dp(m, vector<int>(n, 0));

        // S是主串,T是匹配串
        // 初始化,匹配串的第一个字符在主串中出现的位置
        for(int j = 0; j < n; j++) {
            if(T[0] == S[j]) dp[0][j] = 1;
        }
        // 
        for(int i = 1; i < m; i++) {
            for(int j = 0; j < n; j++) {
                if(T[i] == S[j]) {
                    // 状态转移方程,当前的结果数为上一行所有遇到的情况的加和
                    // 即: dp[i][j] = sum(dp[i-1][0],...,dp[i-1][j-1]);
                    for(int leftJ = j-1; leftJ >= 0; leftJ--) {
                        dp[i][j] += dp[i-1][leftJ];
                    }
                }
            }
        }
        // 匹配总数是最后一个匹配字符在主串中分别出现的位置的总数加和
        for(int j = 0; j < n; j++) 
            ans += dp[m-1][j];
        return ans;
    }
};