题目链接:戳这里
题目大意:给你两个字符串s和t,求s的子串等于t的子序列的个数。
题解:定义dp[i][j]表示考虑到s的第i个字符,t的第j个字符的情况。显然dp[i][j]=dp[i][j-1],只有当s[i]==t[j]时,dp[i][j]=dp[i][j-1]+dp[i-1][j-1]+1。
代码:
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
typedef long long LL;
char s[5005],t[5005];
int dp[5005][5005];
int n,m,ans;
int main()
{
scanf("%s%s",s+1,t+1);
n=strlen(s+1),m=strlen(t+1);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
dp[i][j]=dp[i][j-1];
if(s[i]==t[j]) dp[i][j]=(dp[i][j]+dp[i-1][j-1]+1)%mod;
}
ans=(ans+dp[i][m])%mod;
}
printf("%d\n",ans);
return 0;
}