hdu5791Two(dp)

题意就是给你两个数组,问这两个数组的相同的子序列有多少个。

其实这题有点像变形的最长公共子串

a[ i ]==a[ j ]时,dp[ i ][ j ]=dp[ i-1 ][  j ]+dp[ i ][ j-1 ]+1

a[ i ] !=a[ j ]时 ,dp[ i ][ j ]=dp[ i-1 ][ j ]+dp[ i ][ j-1 ]-dp[ i-1 ][ j-1 ]

AC代码:

#include
#include
#include
#include
using namespace std;
const int maxn=1100;
const int mod=1000000007;
typedef __int64 ll;
ll dp[maxn][maxn];
int a[maxn],b[maxn];
int main(){
	int n,m;
	while(~scanf("%d%d",&n,&m)){
		memset(dp,0,sizeof(dp));
		for(int i=1;i<=n;i++)	scanf("%d",&a[i]);
		for(int i=1;i<=m;i++)	scanf("%d",&b[i]);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				if(a[i]==b[j])
					dp[i][j]=(dp[i-1][j]+dp[i][j-1]+1)%mod;
				else
					dp[i][j]=(dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+mod)%mod;//这里注意要加mod 因为有可能会减出负数
			}
		}
		cout<


你可能感兴趣的:(动态规划)