【题意】给了你两个字符串s1,s2,问你s2在s1中出现的次数,注意是子序列就行了,不一定要连续.
【分析】显然是个dp!
【状态表示】dp[i][j]代表s1串中的前i个字符和字符串2中的前j个字符匹配的最大值。
【状态转移 】dp[i][j] = dp[i-1][j] (s[i-1]!=s[j-1]),dp[i][j] = dp[i][j]+dp[ii-1][j-1],(s1[i-1]==s2[j-1]);
【坑点】高精度,这里用java整的,真是坑!!!
【AC代码】
package Main;
import java.util.*;
import java.math.*;
public class Main{
public static void main(String[] args){
int T,i,j,k;
String s1,s2;
BigInteger dp[][] = new BigInteger[10010][110];
Scanner cin=new Scanner(System.in);
T=cin.nextInt();
for(k=1; k<=T; k++)
{
s1 = cin.next();
s2 = cin.next();
int len1 = s1.length();
int len2 = s2.length();
for(i=0; i<=len1; i++)
for(j=0; j<=len2; j++)
dp[i][j]=BigInteger.ZERO;
for(i=0; i<=len1; i++)dp[i][0] = BigInteger.ONE;
for(i=1; i<=len1; i++)
{
for(j=1; j<=len2; j++)
{
dp[i][j] = dp[i-1][j];
if(s1.charAt(i-1)==s2.charAt(j-1))
{
dp[i][j]=dp[i][j].add(dp[i-1][j-1]);
}
}
}
System.out.println(dp[len1][len2]);
}
}
}