UVA 10069 Distinct Subsequences


// [解题方法]
// dp[i][j]表示Z串的[0~i]子串在X串的[0~(j-1)]子串中的出现次数
// 初始化:dp[i][0] = 0
// 状态转移1:
// dp[0][j+1] = (Z[0]==X[j])?(dp[0][j]+1):(dp[0][j])
// 状态转移2(i>0):
// dp[i][j+1] = (Z[i]==X[j])?(dp[i][j]+dp[i-1][j]):(dp[i][j])
// 这题需要大数运算,我偷懒用了java
// 另外由于每次转移实际上只用到两个数组,所以这里就只开了两个数组循环使用,相当于滚动数组了

import java.util.*;
import java.io.*;
import java.math.*;

public class Main
{
static public void main (String[] args) throws IOException
{
Scanner cin = new Scanner (new BufferedInputStream (System.in));
BigInteger dp[][] = new BigInteger [2][10001];
int t, n, m, i, j, k;
String s, p;
t = cin.nextInt();
while (t > 0)
{
t--;
s = cin.next();
p = cin.next();
n = s.length();
m = p.length();
k = 0;
dp[0][0] = dp[1][0] = BigInteger.valueOf(0);
for (j = 0; j < n; j++)
{
dp[k][j+1] = dp[k][j];
if (s.charAt(j) == p.charAt(0))
dp[k][j+1] = dp[k][j+1].add(BigInteger.valueOf(1));
}
for (i = 1; i < m; i++)
{
k = (k+1)%2;
for (j = 0; j < n; j++)
{
dp[k][j+1] = dp[k][j];
if (s.charAt(j) == p.charAt(i))
dp[k][j+1] = dp[k][j+1].add(dp[(k+1)%2][j]);
}
}
System.out.println(dp[k][n]);
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值