hdu5791 TWO
hdu5791 TWO
题意
给你两个数串
问你两个数串有多少子串一致
子串不一定是连续的
解法
我们设 \(dp[i][j]\) 表示A串匹配到 i 位,B串匹配到 j 位,一致的子串数。那么我们有转移方程:
\(dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]\)
而如果 \(a[i]==b[j]\) 的话,我们还要加上 \(dp[i-1][j-1] + 1\) 。这样就完了。
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <cctype>
#include <vector>
#define INF 2139062143
#define MAX 0x7ffffffffffffff
#define del(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
template
inline void read(T&x)
{
x=0;T k=1;char c=getchar();
while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=k;
}
const int maxn=1000+5;
const int mod=1e9+7;
int mul(int x,int y) {return 1ll*x*y%mod;}
int add(int x,int y) {return (x+y)%mod;}
int pul(int x,int y) {return (x-y+mod)%mod;}
int dp[maxn][maxn];
int a[maxn],b[maxn];
int n,m;
int main()
{
while(~scanf("%d %d",&n,&m)) {
del(dp,0);
for(int i=1;i<=n;i++) read(a[i]);
for(int i=1;i<=m;i++) read(b[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if(a[i]!=b[j])
dp[i][j]=pul(add(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1]);
else
dp[i][j]=add(add(dp[i-1][j],dp[i][j-1]),1);
}
printf("%d\n",dp[n][m]);
}
return 0;
}
hdu5791 TWO的更多相关文章
- 多校联合训练&hdu5791 Two
hdu5791 dp[i][j]表示的是序列A前i个数字和序列B前j个数字的公共子序列的总个数,那么的dp公式就可以这么表示 理解一下此公式若最尾部的a[i]和b[j]相等的话,那么单独的a[i]和b ...
- hdu5791(DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5791 参考博客:https://blog.csdn.net/wuxuanyi27/article/de ...
- 2016 Multi-University Training Contest 5 1011 Two DP
http://acm.hdu.edu.cn/showproblem.php?pid=5791 HDU5791 Two 题意 :两个数组,多少个不连续子串相等 思路: dp[i][j] :a串i结尾,b ...
随机推荐
- Mysql插入语句.txt
INSERT INTO 目标表 SELECT * FROM 来源表;比如要将 articles 表插入到 newArticles 表中,则是:INSERT INTO newArticles SELEC ...
- Java包名称中通配符的含义
"com.abc 表示的意义为:系统从com.abc这个包及其子孙包扫描组件 "com.abc.* 表示的意义为:系统从com.abc这个包的子孙包扫描组件
- Problem 13
Problem 13 # Problem_13 """ Work out the first ten digits of the sum of the following ...
- vue v-for下图片src显示失败,404错误
- VR开发2015年终总结
本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50617605 作者:car ...
- CommonJS,AMD,RequireJS的差别
RequireJS实现了AMD的API. CommonJS是使用exports对象来定义模块的一种方法,它定义了模块的内容.简单地实现一个CommonJS的定义就像以下这样: // someModul ...
- C语言实现使用动态数组实现循环队列
我在上一篇博客<C语言实现使用静态数组实现循环队列>中实现了使用静态数组来模拟队列的操作. 因为数组的大小已经被指定.无法动态的扩展. 所以在这篇博客中,我换成动态数组来实现. 动态数组能 ...
- 从C到C++(下)
继承 从一个类派生到另外一个类,使前者的所有特征在后者中自己主动可用. 他能够声明一些类型,这些类型能够共享部分或所有曾经所声明的类型.它也能够从超过一个的基类中共享一些特性. C++是支持多继承的. ...
- java中super的作用
super()的作用 super能够用来訪问超类的构造方法和被子类所隐藏的方法.假设子类中有方法与超类中的方法名称和參数同样,则超类中的方法就被隐藏起来,也就是说在子类中重载了父类中的方法. 引用父类 ...
- php面向对象之get和set方法
php面向对象之get和set方法 简介 1.自己写get或者set 2.用系统的魔术方法__get和__set 代码 <?php class Person{ private $userName ...