题目链接: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;
}