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. Jolt Awards: The Best Books

    Jolt大奖素有“软件业界的奥斯卡”之美誉,共设通用类图书.技术类图书.语言和开发环境.框架库和组件.开发者网站等十余个分类,每个分类设有一个“震撼奖”(Jolt Award)和三个“生产力奖”(Pr ...

  2. RabbitMQ学习系列二-C#代码发送消息

    RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...

  3. LeetCode 366. Find Leaves of Binary Tree

    原题链接在这里:https://leetcode.com/problems/find-leaves-of-binary-tree/#/description 题目: Given a binary tr ...

  4. 利用DAC(Data-tier Application)实现数据库结构迁移

    从一个存在的库,抽取其表结构,对象,权限等,再部署成一个不包含数据的"空库"的方法有很多种.如自带的Generate Scripts功能,自定义脚本提取创建脚本等. 在实际使用中, ...

  5. Servlet概念入门

    什么是Servlet Servlet 为创建基于 web 的应用程序提供了基于组件.独立于平台的方法,可以不受 CGI 程序的性能限制.Servlet 有权限访问所有的 Java API,包括访问企业 ...

  6. laravel查看sql语句

    我自己是用第一种方法来调试的,第三种不行 不知道为啥 laravel查看sql语句 方法一: 我们有时候想测试一段代码生产的 SQL 语句,比如: 我们想看 App\User::all(); 产生的 ...

  7. What’s that ALUA exactly?

    What’s that ALUA exactly? 29 September, 20098 Comments Of course by now we have all read the excelle ...

  8. phantomjs 安装和试用

    准备学习casperjs, 发现官网上说  it’s an extremely useful companion to PhantomJS, 所以决定下把它下来试试.下载安装(win7)没什么可说的, ...

  9. PHP面向对象深入研究之【对象生成】

    对象 看个例子 <?php abstract class Employee { // 雇员 protected $name; function __construct( $name ) { $t ...

  10. python开发模块基础:正则表达式

    一,正则表达式 1.字符组:[0-9][a-z][A-Z] 在同一个位置可能出现的各种字符组成了一个字符组,在正则表达式中用[]表示字符分为很多类,比如数字.字母.标点等等.假如你现在要求一个位置&q ...