dp[i][j]的定义为s[i:]的子序列在t[j:]中出现的次数
递推关系式:
if(s[i]!=t[j]){ dp[i][j]=dp[i+1][j]; } else{ //分为两部分即可理解为小球的放还是不放 dp[i][j]=dp[i+1][j+1]+dp[i+1][j]; }
数组初始化:
for(int i=0;i<=s_len;i++){ dp[i][t_len]=1; } /*可省略*/ for(int i=0;i<t_len;i++){ dp[s_len][i]=0; }
class Solution { public: int numDistinct(string s, string t) { vector<vector<unsigned long long int>> dp(1010,vector<unsigned long long int>(1010,0)); int s_len=s.size(); int t_len=t.size(); for(int i=0;i<=s_len;i++){ dp[i][t_len]=1; } for(int i=s_len-1;i>=0;i--){ for(int j=t_len;j>=0;j--){ if(s[i]!=t[j]){ dp[i][j]=dp[i+1][j]; } else{ dp[i][j]=dp[i+1][j+1]+dp[i+1][j]; } } } return dp[0][0]; } };