Likou 115. Different sub-sequence dp

https://leetcode-cn.com/problems/distinct-subsequences/
Insert picture description here
Idea: dpij dp_{ij}dpijMeans s [i:] s[i:]s[i:In the subsequence of]t [j:] t[j:]t[j:] Number of occurrences, then initiallydp [i] [m] = 1 dp[i][m]=1dp[i][m]=1,当 s [ i ] = t [ j ] s[i]=t[j] s[i]=When t [ j ] ,t [j] t[j]t [ j ] can choose whether to matchs [i] s[i]s [ i ] matches, so we getdp [i] [j] = dp [i + 1] [j + 1] + dp [i + 1] [j] dp[i][j]=dp[i+1 ][j+1]+dp[i+1][j]dp[i][j]=dp[i+1][j+1]+dp[i+1][j];否则 d p [ i ] [ j ] = d p [ i + 1 ] [ j ] dp[i][j]=dp[i+1][j] dp[i][j]=dp[i+1 ] [ j ] . To open longlong.

class Solution {
    
    
public:
    int numDistinct(string s, string t) {
    
    
        int n=s.size(),m=t.size();
        if(n<m)
            return 0;
        using ll=long long;
        vector<vector<ll>> dp(n+1,vector<ll>(m+1));
        for(int i=0;i<=n;i++)
            dp[i][m]=1;
        for(int i=n-1;i>=0;i--)
        {
    
    
            int minj=max(0,m-(n-i));
            for(int j=m-1;j>=minj;j--)
            {
    
    
                dp[i][j]=dp[i+1][j];
                if(s[i]==t[j])
                    dp[i][j]+=dp[i+1][j+1];
            }
        }
        return dp[0][0];
    }
};

Guess you like

Origin blog.csdn.net/xiji333/article/details/114932299