题链:http://acm.hdu.edu.cn/showproblem.php?pid=5282

Senior's String

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)

Total Submission(s): 142    Accepted Submission(s): 40

Problem Description
Xuejiejie loves strings most. In order to win the favor of her, a young man has two strings
X,
Y
to Xuejiejie. Xuejiejie has never seen such beautiful strings! These days, she is very happy. But Xuejiejie is missish so much, in order to cover up her happiness, she asks the young man a question. In face of Xuejiejie, the young man is flustered. So he asks
you for help.



The question is that :

Define the L
as the length of the longest common subsequence of
X
and Y.(
The subsequence does not need to be continuous

in the string, and a string of length L
has 2L
subsequences containing the empty string ). Now Xuejiejie comes up with all subsequences of length
L
of string X,
she wants to know the number of subsequences which is also the subsequence of string
Y.
 
Input
In the first line there is an integer
T,
indicates the number of test cases.



In each case:



The first line contains string X,
a non-empty string consists of lowercase English letters.



The second line contains string Y,
a non-empty string consists of lowercase English letters.



1≤|X|,|Y|≤1000,
|X|
means the length of X.
 
Output
For each test case, output one integer which means the number of subsequences of length
L
of X
which also is the subsequence of string Y
modulo 109+7.
 
Sample Input
2
a
b
aa
ab
 
Sample Output
1
2
 

中文题意:

学姐姐很喜欢字符串,所以学弟送给了她两个字符串作为礼物。

两个字符串分别为X。Y。

她很开心,但在开心之余她还想考考学弟。

她定义L为X与Y的最长公共子序列的长度(子序列在字符串内不一定连续。一个长度为L的字符串有2L个子序列,包含空子序列)。

如今学姐姐取出了X的全部长度为L的子序列。并要求学弟回答在这些子序列中,有多少个是Y的子序列。

由于答案可能很大,所以学弟仅仅须要回答终于答案模109+7。

官方题解:

wei里存的是Y串的前j个字母中,  26个字母最后出如今第几个(字符串下标+1)

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAX_N 1100//再大dp数组会爆的 O(n*m)
char a[MAX_N],b[MAX_N];
int dp[MAX_N+1][MAX_N+1];
int dd[MAX_N+1][MAX_N+1];//b前j个字母中 最后一个 与x[i]
int wei[MAX_N+1][26];//Y前i个字母中 最后一个j字母在的位置
__int64 f[MAX_N+1][MAX_N+1]; int mod=1e9+7;
int main()
{
int n,m,tem,t;
scanf("%d",&t);
while(t--)
{
scanf("%s%s",a,b);
memset(dp,0,sizeof(dp));
n=strlen(a);
m=strlen(b);
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i]==b[j])
dp[i+1][j+1]=max(dp[i][j]+1,max(dp[i+1][j],dp[i][j+1]));
else
dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
}
}
memset(wei,0,sizeof wei);
for(int i=1;i<=m;i++)
{
for(int j=0;j<26;j++)
wei[i][j]=wei[i-1][j];
wei[i][b[i-1]-'a']=i;
}
memset(f,0,sizeof f);
for(int i=0;i<=n;i++)
{
for(int j=0;j<=m;j++)
{
if(dp[i][j]==0)
{
f[i][j]=1;
continue;
}
if(dp[i-1][j]==dp[i][j])
f[i][j]=(f[i][j]+f[i-1][j])%mod;
int p=wei[j][a[i-1]-'a'];
if(p)
{
if(dp[i-1][p-1]+1==dp[i][j])
f[i][j]=(f[i][j]+f[i-1][p-1])%mod;
}
}
} printf("%I64d\n",f[n][m]%mod);
}
return 0;
}

hdu 5282 Senior&#39;s String 两次dp的更多相关文章

  1. HDU 5280 Senior&#39;s Array 最大区间和

    题意:给定n个数.要求必须将当中某个数改为P,求修改后最大的区间和能够为多少. 水题.枚举每一个区间.假设该区间不改动(即改动该区间以外的数),则就为该区间和,若该区间要改动,由于必须改动,所以肯定是 ...

  2. HDU 5281 Senior&#39;s Gun 杀怪

    题意:给出n把枪和m个怪.每把枪有一个攻击力,每一个怪有一个防御力.假设某把枪的攻击力不小于某个怪的防御力则能将怪秒杀,否则无法杀死.一把枪最多仅仅能杀一个怪,不能用多把枪杀同一个怪.每杀一次怪能够得 ...

  3. HDU 5281 Senior&#39;s Gun

    Senior's Gun Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Tot ...

  4. hdu 5030 Rabbit&#39;s String(后缀数组&amp;二分法)

    Rabbit's String Time Limit: 40000/20000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others ...

  5. HDU 5280 Senior&#39;s Array

    Senior's Array Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) T ...

  6. hdu 4865 Peter&#39;s Hobby(概率dp)

    http://acm.hdu.edu.cn/showproblem.php? pid=4865 大致题意:有三种天气和四种叶子状态.给出两个表,各自是每种天气下叶子呈现状态的概率和今天天气对明天天气的 ...

  7. 【HDU 3336】Count the string(KMP+DP)

    Problem Description It is well known that AekdyCoin is good at string problems as well as number the ...

  8. hdu 2476"String painter"(区间DP)

    传送门 https://www.cnblogs.com/violet-acmer/p/9852294.html 题意: 给定字符串A,B,每次操作可以将字符串A中区间[ i , j ]的字符变为ch, ...

  9. hdu 4057 AC自己主动机+状态压缩dp

    http://acm.hdu.edu.cn/showproblem.php?pid=4057 Problem Description Dr. X is a biologist, who likes r ...

随机推荐

  1. 基于visual Studio2013解决面试题之0804复杂链表

     题目

  2. 【书评】RHCSA/RHCE Red Hat Linux 认证学习指南(第6版)EX200 & EX300

    这次参加 CSDN 举办的读书活动,正赶上项目忙,看得也是断断续续,拖了2周了,才能来写这个书评. ========== 书评的分割线 ========== 首先,我会肯定的告诉你,不论你是一名专业的 ...

  3. linux-shell脚本命令之sed

    [ sed简单介绍: ] sed是一个非常好的文件处理工具, 它本身是一个管道命令, 以行为单位进行处理, 能够用于对数据行进行新增.选取.替换.删除等操作. sed命令行格式:sed [-nefri ...

  4. 【Unity3D】【NGUI】UICamera

    原文:http://www.tasharen.com/forum/index.php?topic=6711.0 NGUI讨论群:333417608 概述 UICamera这个名字不是很合适,保留的原因 ...

  5. Java中@Deprecated、@SupressWarning、@Override的作用

    Annotation注解在 Java 中有着很广泛的,他是做为一种标识 为javac所识别.每一个注解 都对应这一个Java类  在java.lang包中 有三个注解  分别是 Deprecated  ...

  6. TObject简要说明-对象的创建流程

    TObject = class    //创建    constructor Create;    //释放    procedure Free;    //初始化实列    class functi ...

  7. uva 1374 快速幂计算

    #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #i ...

  8. 【deep learning学习笔记】注释yusugomori的LR代码 --- 模型测试

    测试部分代码: void test_lr() { srand(0); double learning_rate = 0.1; double n_epochs = 500; int train_N = ...

  9. 『openframeworks』shader制作三角形马赛克效果

    不久前做了六边形马赛克的效果,很有意思,乘热打铁,弄了个三角形马赛克. 首先肯定是等边三角形,这样才能真正的无缝拼接.观察发现,三角形可以拼接成之前做个的六边形. 如下图: 我们可以发现6个三角形正好 ...

  10. win32创建控件的一些问题

    在我们使用CreateWindow();像一般控件建Windows扩展控件的时候我们会发现控件没有创建成功 这是因为我们没有对Windows扩展控件库进行初始化,这要我们使用InitCommonCon ...