UVA 10069 dp+高精度

来源:互联网 发布:自然之名酵母水 知乎 编辑:程序博客网 时间:2024/05/19 18:15

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


1 0
原创粉丝点击