http://www.elijahqi.win/archives/571
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
2016 Multi-University Training Contest 5
Recommend
wange2014 | We have carefully selected several similar problems for you: 6160 6159 6158 6157 6156
之前为了学习tjoi 公共字串看了许多这个题,一直也没实现 今天实现一下,明后天把作业判完,下学期就停课好好Oi了。
用了一定容斥原理的知识
f[i][j]= (a[i]==b[j]) f[i-1][j]+f[i][j-1]+1
(a[i]!=b[j])f[i-1][j]+f[i][j-1]-f[i-1][j-1]
#include<cstdio>
#include<cstring>
#define N 1100
#define mod 1000000007
inline int read(){
int x=0;char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while (ch<='9'&&ch>='0'){x=x*10+ch-'0';ch=getchar();}
return x;
}
long long f[N][N];
int n,m,a[N],b[N];
int main(){
freopen("hdu5791.in","r",stdin);
while (~scanf("%d%d",&n,&m)){
memset(f,0,sizeof(f));
for (int i=1;i<=n;++i) a[i]=read();
for (int i=1;i<=m;++i) b[i]=read();
for (int i=1;i<=n;++i){
for (int j=1;j<=m;++j){
f[i][j]=(f[i-1][j]+f[i][j-1]-f[i-1][j-1]+mod)%mod;
if (a[i]==b[j]) (f[i][j]+=f[i-1][j-1]+1)%=mod;
}
}
printf("%d\n",f[n][m]);
}
return 0;
}