http://acm.hdu.edu.cn/showproblem.php?pid=5791

            Two

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 2599    Accepted Submission(s): 1111

Problem Description
Alice gets two sequences A and B. A easy problem comes. How many pair of sequence A' and sequence B' are same. For example, {1,2} and {1,2} are same. {1,2,4} and {1,4,2} are not same. A' is a subsequence of A. B' is a subsequence of B. The subsequnce can be not continuous. For example, {1,1,2} has 7 subsequences {1},{1},{2},{1,1},{1,2},{1,2},{1,1,2}. The answer can be very large. Output the answer mod 1000000007.
 
Input
The input contains multiple test cases.

For each test case, the first line cantains two integers N,M(1≤N,M≤1000). The next line contains N integers. The next line followed M integers. All integers are between 1 and 1000.

 
Output
For each test case, output the answer mod 1000000007.
 
Sample Input
3 2
1 2 3
2 1
3 2
1 2 3
1 2
Sample Output
2
3
 
Author
ZSTU
 
Source
 
Recommend
wange2014   |   We have carefully selected several similar problems for you:  6263 6262 6261 6260 6259 
 

题目分析:

HDU多校第五场的1011。 
题目大意是有两个序列,其长度为n和m。求他们的子序列相同的个数。 
DP题,推导公式,dp[i][j]表示在第一个序列前i个位置和第二个序列前j个位置下,有多少种子序列相同情况。 
可以推出,如果某个第一个序列的i位置与第二个序列j位置元素不同,其dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]。 
将i和j分开看,如果没有i,第一个序列前i-1个与第二个序列前j个有多少种相同的,和第一个序列前i个与第二个序列前j-1个有多少相同。同时,需要减掉dp[i-1][j-1],因为在之前将第一个序列前i-1和第二个序列前j-1计算了两边。 
如果第一个序列i位置与第二个序列j位置元素相同,需要加上i与j相同的一个之外,还需要加上dp[i-1][j-1],因为dp[i-1][j-1]可以与i配对相同,也可以与j配对相同,于是就需要重复计算一次。 
dp[i][j]=dp[i-1][j]+dp[i][j-1]+1。(实际上对于最后相等的话,算上最后一对就有a[i - 1][j - 1] + 1种(肯定比a[i-1][j - 1多一种),不算的话,则是a[i-1][j] + a[i][j - 1] - a[i - 1][j - 1])

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int a[1005];
int b[1005];
long long dp[1005][1005];
int mod = 1000000007; long long find(int i, int j){
if(i < 0 || j < 0)
return 0;
if(dp[i][j] != -1){ //如果是 != 0 会TLE!!! 因为这个题就算搜索过也有大量为0的情况,故初始化的初始值要避免用0
return dp[i][j];
}
if(a[i] == b[j]){
return dp[i][j] = (find(i - 1, j) + find(i, j - 1) + 1) % mod; //这里实际上是还有 + find(i-1,j-1) - find(i-1,j-1);
}
else{
return dp[i][j] = (find(i - 1, j) + find(i, j - 1) - find(i - 1, j - 1) + mod) % mod; //加一个mod防止有负的
}
} int main(){
// std::ios::sync_with_stdio(false);
int n, m;
while(cin >> n >> m){
memset(dp, -1, sizeof(dp));
for(int i = 0; i < n; i++){
cin >> a[i];
// scanf("%d", &a[i]);
}
for(int j = 0; j < m; j++)
cin >> b[j];
// scanf("%d", &b[j]);
cout << find(n - 1, m - 1) << endl;
}
return 0;
}

  

22-Two(公共子序列的个数)的更多相关文章

  1. codevs 1862 最长公共子序列(求最长公共子序列长度并统计最长公共子序列的个数)

    题目描述 Description 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y ...

  2. HDU 5791 Two(LCS求公共子序列个数)

    http://acm.split.hdu.edu.cn/showproblem.php?pid=5791 题意: 给出两个序列,求这两个序列的公共子序列的总个数. 思路: 和LCS差不多,dp[i][ ...

  3. LCS修改版(Longest Common Subsequence 最长公共子序列)

    题目描述 作为一名情报局特工,Nova君(2号)有着特殊的传达情报的技巧.为了避免被窃取情报,每次传达时,他都会发出两句旁人看来意义不明话,实际上暗号已经暗含其中.解密的方法很简单,分别从两句话里删掉 ...

  4. 【LOJ】#2172. 「FJOI2016」所有公共子序列问题

    题解 听说是什么序列自动机? 我们考虑对于每个位置的串,下面拼接相同的字符时,拼接最近的一个,这样可以保证不重不漏 为了实现这个我们需要什么呢,我们需要一个链表,记录一下每个位置的下一个字符会转移到哪 ...

  5. 基于公共子序列的轨迹聚类(c#)

    前言 如今的世界中,想要研究人们的出行活动,可以利用智能手机或智能手环等个人设备生成的 GPS 数据进行研究.而在众多的研究方向中,出行的热点路线或者说经常出行的路线也比较受欢迎.采用热力图的方式对其 ...

  6. HDU 1159 Common Subsequence (动态规划、最长公共子序列)

    Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. 洛谷 P2516 [HAOI2010]最长公共子序列

    题目传送门 解题思路: 第一问要求最长公共子序列,直接套模板就好了. 第二问要求数量,ans[i][j]表示第一个字符串前i个字符,第二个字符串前j个字符的最长公共子序列的数量 如果f[i][j]是由 ...

  8. 子序列 sub sequence问题,例:最长公共子序列,[LeetCode] Distinct Subsequences(求子序列个数)

    引言 子序列和子字符串或者连续子集的不同之处在于,子序列不需要是原序列上连续的值. 对于子序列的题目,大多数需要用到DP的思想,因此,状态转移是关键. 这里摘录两个常见子序列问题及其解法. 例题1, ...

  9. 简单Dp----最长公共子序列,DAG最长路,简单区间DP等

    /* uva 111 * 题意: * 顺序有变化的最长公共子序列: * 模板: */ #include<iostream> #include<cstdio> #include& ...

随机推荐

  1. win2003从组策略关闭端口(445/135/137/138/139/3389等)教程

    一些恶劣的病毒会从某些端口入侵计算机,因此关闭某些用不到的而又具有高风险的端口就显得很有必要,是服务器管理员要做的基本的安全防范.本文将介绍win2003系统在组策略关闭某一个端口的教程,文章以关闭4 ...

  2. verilog数组定义及其初始化

    这里的内存模型指的是内存的行为模型.Verilog中提供了两维数组来帮助我们建立内存的行为模型.具体来说,就是可以将内存宣称为一个reg类型的数组,这个数组中的任何一个单元都可以通过一个下标去访问.这 ...

  3. fpga产生伪随机序列

    1,一位模二加法法则:加减法等同于异或,没有进位. 2,将移位寄存器的某几级作为抽头进行模二加法后作为反馈输入,就构成了有反馈的动态移位寄存器.此方法产生的序列是有周期的. 3,假设移位寄存器的级数为 ...

  4. spring Bean配置的三种形式

    Spring Bean配置有以下三种形式: 传统的xml配置 Spring 2.5 以后新增注解配置 Spring3.0以后新增JavaConfig 1. 传统的xml配置 <?xml vers ...

  5. 关于Apache Phoenix和Cloudera结合

    1. 安装: phoenix的官网最新版4.13.2是有parcle版本的,并不需要从cloudera的labs(实验室)中下载.安装完成后,可以运行一下phoenix的shell来简单验证一下:/o ...

  6. Maven入门----MyEclipse创建maven项目(二)

    新建项目: Next next next 新建项目后,MyEclipse会自动从远程仓库中下载支持包,需要几分钟左右时间. 项目结构图: HelloWorld.java public class He ...

  7. git常用命令小结

    1.ssh连接方式 公钥生成ssh-keygen -t rsa -C "764432054@qq.com"在用户家目录下的.ssh目录下生成 id_rsa ,id_rsa.pub ...

  8. android开源库收集

    1. google valley Android网络通信库 git clone https://android.googlesource.com/platform/frameworks/volley ...

  9. 二 mysql容量规划,性能测试

    何为基线- 当前运行状态记录.快照- 用于和未来的状态进行对比- 未来时刻产生关键事件后的新状态,作为下一个基线基线数据收集,关注哪些要点- 系统负载- MySQL运行状态- 相应的业务指标1.系统& ...

  10. SE新手游操控创新:一个按键=五个技能

    转自:http://www.gamelook.com.cn/2015/01/201299 GameLook报道 / 日本游戏厂商一向擅长搞发明创造,除了诞生了各种烧脑奇葩游戏以外,日本主流手机游戏的核 ...