UVa 10069 - Distinct Subsequences

传送门

UVa 10069 - Distinct Subsequences

题意

B是A的子序列,求A中有几个B。

思路

没思路,参考了BearChild的解题报告
用dp[i][j]表示a字符串的前j长度中包含b字符串前i字符的数量。
状态转移方程

a[j] = b[i], dp[i][j] = dp[i- 1][j - 1] + dp[i][j - 1]
a[j] != b[i], dp[i][j] = dp[i][j - 1]

代码

import java.math.*;
import java.io.*;
import java.text.*;
import java.util.*;
public class Main {
     public static void main(String[] args) {
        Scanner cin = new Scanner (new BufferedInputStream (System.in));
        BigInteger dp[][] = new BigInteger[110][11000];
        String a, b;
        int T, i, j;
        T = cin.nextInt();
        while (T-- > 0) {
            a = cin.next();
            b = cin.next();
            int alen = a.length();
            int blen = b.length();
            for (i = 0; i <= alen; i++) {
                dp[0][i] = BigInteger.ONE;
            }
            for (i = 1; i <= blen; i++) {
                dp[i][0] = BigInteger.ZERO;
                for (j = 1; j <= alen; j++) {
                    dp[i][j] = dp[i][j - 1];
                    if (b.charAt(i - 1) == a.charAt(j - 1)) {
                        dp[i][j] = dp[i][j].add(dp[i - 1][j - 1]);
                    }
                }
            }
            System.out.println(dp[blen][alen]);
        }
    }
}

Powered by Jekyll and Theme by solid