uva10069(DP+大数)

题意:找出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()]);
            }
        }
    }
}

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

时间: 2024-10-21 06:37:09

uva10069(DP+大数)的相关文章

[hdu 4933]Miaomiao&#39;s Function 数位DP+大数

Miaomiao's Function Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 79    Accepted Submission(s): 18 Problem Description Firstly , Miaomiao define two functions f(x) , g(x): (K is the smallest

Buy the Ticket DP +大数

Buy the Ticket 题目抽象:有m个手持50元的人,n个手持100元的人,售票处没有准备钱.问有多少种不同的方案使得购票不中断.每个人是不同的个体. 分析:简单DP题.画个格子,那么选取的点不越过对角线y = x.  dp[i][j]表示i个100元的人,j个手持50元的人的方案数.     i<=j dp[i][j] = dp[i-1][j]+dp[i][j-1];  i>j  dp[i][j] = 0;  如果对某些点有限制,那么在递推是加条件判断. ans = dp[n][m]

uva 10069 Distinct Subsequences 【dp+大数】

题目:uva 10069 Distinct Subsequences 题意:给出一个子串 x 和母串 s ,求子串在母串中的不同序列的个数? 分析:定义dp[i][j]:x 的前 i 个字母在 s 的前 j 个字母中的出现次数: dp [ i ] [ j ] = dp [ i ] [ j - 1 ] ; if ( x[ i ] == s [ j ] ) dp[i][j]=add(dp[i-1][j-1],dp[i][j]); 注意点:1:出现次数非常大,要用大数加法 2::注意初始化 AC代码:

poj--1625Censored!+AC自动机上的dp+大数

题目链接:点击进入 其实看起来是完全可以用矩阵做的,但是因为用到了大数的,导致内存开不下,所以用dp写了.其实dp的过程依旧就是在我们用禁止出现单词构建的trie上走m步的过程.我们定义dp[i][j]表示走过i步以后到达节点j的方案数,则状态转移应该是dp[i][j]=sum(dp[i-1][k]),其中k表示可以走到j的节点,并且不能是病毒节点.但是其实这样代码就不是那么好写了,其实我们可以用节点j主动的去更新它的子节点k,这样转移方程就成了dp[i][next[j][k]]+=dp[i-1

UVA 10069 ---Distinct Subsequences +DP+大数

可以定义dp[i][j]表示第一个串的前i个字符中含有第二个串的前j个字符的总情况数: 则:如dp[i][j]=dp[i-1][j],如果str1[i]==str2[j]则dp[i][j]+=dp[i-1][j-1]; 初始时讲所有的dp[i][0]赋值为1,其他为0. 然后这个题目需要用到大数,可以用C++重载运算符,或者是java的大数类: 我用的是java,第一次用java的大数,感觉还不错 :) 代码如下: import java.util.*; import java.math.*;

URAL 1158 AC自动机上的简单DP+大数

题目大意 在一种语言中的字母表中有N(N<=50)个字母,每个单词都由M(M<=50)个字母构成,因此,一共可以形成N^M个单词.但是有P(P<=10)个串是被禁止的,也就是说,任何单词的子串都不能包含这P个串中的任意一个.问按照上述规则,能产生的合法串一共有多少个? 例如:N=3 M=3 P=3 字母表中的三个字符是QWE 被禁止的串为”QQ”,”WEE”,”Q”,则合法的串一共有7个. 这题目相当于通过步数对AC自动机上每一个点的状态进行DP dp[i][j]表示到达i这个点,走了j

uva 10069 Distinct Subsequences (dp + 大数)

uva 10069 Distinct Subsequences 题目大意:给出两个字符串A和B,找出A中所有与B相同的子字符串. 解题思路:if(A[j?1]==B[i?1]){ dp[i][j]=dp[i][j]+dp[i?1][j?1]; } import java.math.BigInteger; import java.util.Scanner; /** * Created by spzn on 15-3-30. */ public class Main { public static

poj3181 Dollar Dayz (DP+大数)

Dollar Dayz Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3181 Appoint description: System Crawler (2016-05-27) Description Farmer John goes to Dollar Da

HDU 5568 sequence2 区间dp+大数

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5568 题意: 求所有长度为k的严格升序子序列的个数. 题解: 令dp[i][k]表示以i结尾的长度为k的所有严格升序子序列的个数,则有状态转移:dp[i][k]+=dp[j][k-1](其中,arr[i]>arr[j],并且i>j): 最后答案为dp[1][k]+...dp[n][k]. 代码: 1 import java.util.*; 2 import java.math.*; 3 publ