题目链接:http://codeforces.com/contest/163/problem/A
题意:给你两个字符串,然后问你第一个字符串的子串和第二个子序列有多少对相同的串
解法:DP。dp[i][j]表示第一个串以i结尾,第二个串以j结尾的方案数。然后转移我们按照类似于LCS那样去转移就可以 了。
//CF 163A
#include <bits/stdc++.h>
using namespace std;
const int maxn = 5005;
const int mod = 1e9+7;
int dp[maxn][maxn];
char a[maxn], b[maxn];
///dp[i][j]表示第一个串以i结尾,第二个串以j结尾的方案数
int main()
{
scanf("%s", a+1);
scanf("%s", b+1);
int len1 = strlen(a+1);
int len2 = strlen(b+1);
int ans = 0;
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= len1; i++){
for(int j = 1; j <= len2; j++){
dp[i][j] = dp[i][j-1];
if(a[i] == b[j]){
dp[i][j] += dp[i-1][j-1] + 1;
dp[i][j] %= mod;
}
}
ans = (ans + dp[i][len2])%mod;
}
printf("%d\n", ans);
return 0;
}