題目連結:http://codeforces.com/problemset/problem/163/A
題意:
給你兩個字串a,b,問你有多少對"(a的子串,b的子序列)"可以匹配。
題解:
表示狀態:
dp[i][j] = pairs
a的子串以a[i]結尾,b的子序列以b[1 to j]結尾的方案數。
找出答案:
ans = ∑ dp[i][lb]
(la,lb代表a和b的長度)
如何轉移:
dp[i][j] = dp[i][j-1]
if(a[i] == b[j]) dp[i][j] += dp[i-1][j-1]+1
a[i]和b[j]相同時,可以將dp[i][j]中的匹配都向後延伸一位。
同時(a[i],b[j])也是一種匹配,所以還要+1。
邊界條件:
set dp = 0
AC Code:
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #define MAX_N 5005 5 #define MOD 1000000007 6 7 using namespace std; 8 9 int ans=0; 10 int dp[MAX_N][MAX_N]; 11 char a[MAX_N]; 12 char b[MAX_N]; 13 14 int main() 15 { 16 scanf("%s%s",a+1,b+1); 17 int la=strlen(a+1); 18 int lb=strlen(b+1); 19 memset(dp,0,sizeof(dp)); 20 for(int i=1;i<=la;i++) 21 { 22 for(int j=1;j<=lb;j++) 23 { 24 dp[i][j]=(dp[i][j-1]+(a[i]==b[j])*(dp[i-1][j-1]+1))%MOD; 25 } 26 ans=(ans+dp[i][lb])%MOD; 27 } 28 printf("%d\n",ans); 29 }