首页 > 其他 > 详细

uva10069(DP+大数)

时间:2015-07-27 21:05:37      阅读:223      评论:0      收藏:0      [点我收藏+]

题意:找出B串在A串出现的次数(B在A中可以是不连续的)
解答:设母串的长度是j,子串的长度数i,在假设dp[i][j]:是在长度是j的母串中出现长度是i的子串的个数,如果A[j]!=B[i],dp[i][j]=dp[i][j-1]
如果A[j]==B[i]; dp[i][j]=dp[i-][j-1]+dp[i][j-1];
A[j]==B[i]的状态转移,可以这样理解假设此时A串,B串如下(X,#代表其他的字符)
A: XXXXXXG
B: ###G
此时A[7]==B[4],所以你会判断
1:### 在 XXXXXX 中出现的次数
2:###G 在 XXXXXX 中出现的次数
答案是1与2的和

对于大数直接用JAVA好了


import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String args[]){
        int n;
        Scanner cin=new Scanner(System.in);
        while(cin.hasNext()){
            BigInteger dp[][]=new BigInteger[110][10010];
            n=cin.nextInt();
            String a,b;
            while(n-->0){
                a=cin.next();
                b=cin.next();
                for(int i=0;i<dp.length;i++){
                    for(int j=0;j<dp[i].length;j++){
                        dp[i][j]=BigInteger.ZERO;
                    }
                }

                for(int i=0;i<=a.length();i++){
                    dp[0][i]=BigInteger.ONE;
                }
                for(int i=1;i<=b.length();i++){
                    for(int j=i;j<=a.length();j++){
                        if(b.charAt(i-1)==a.charAt(j-1)){
                            dp[i][j]=dp[i][j-1].add(dp[i-1][j-1]);
                        }else {
                            dp[i][j]=dp[i][j-1];
                        }
                    }
                }
                System.out.println(dp[b.length()][a.length()]);
            }
        }
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

uva10069(DP+大数)

原文:http://blog.csdn.net/u013167299/article/details/47089575

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!