题目链接:hdu_5791_Two
题意:
给你两串数列,问你相同的子序列有多少个,要注意,可以重复,比如1 和1 1 1 ,相同的子序列为3个
题解:
就和求最长公共子序列差不多,只不过要全部加起来
下面是官方题解:
Two:
水题。dp[i][j]表示A序列前i个数和B序列前j个数的相同子序列对有多少个。复杂度O(n^2)
#include<cstdio>
#include<cstring>
#define F(i,a,b) for(int i=a;i<=b;i++) const int N=1e3+,mod=1e9+;
int dp[N][N],m,n,a[N],b[N]; int main()
{
while(~scanf("%d%d",&n,&m))
{
F(i,,n)scanf("%d",a+i);
F(i,,m)scanf("%d",b+i);
F(i,,)dp[i][]=dp[][i]=;
F(i,,n)F(j,,m)
{
int *p=&dp[i][j];
*p=(dp[i-][j]+dp[i][j-]-dp[i-][j-])%mod;
if(*p<)*p+=mod;
if(a[i]==b[j])*p=(*p+dp[i-][j-]+)%mod;
}
printf("%d\n",dp[n][m]);
}
return ;
}