UVA 10069 dp+高精度

【题意】给了你两个字符串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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值