【题意】给了你两个字符串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]);
    		}
    	}
}