码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 5282 Senior's String 两次dp

时间:2015-07-12 12:49:01      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:dp

题链:http://acm.hdu.edu.cn/showproblem.php?pid=5282

Senior‘s String

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 142    Accepted Submission(s): 40


Problem Description
Xuejiejie loves strings most. In order to win the favor of her, a young man has two strings X技术分享, Y技术分享 to Xuejiejie. Xuejiejie has never seen such beautiful strings! These days, she is very happy. But Xuejiejie is missish so much, in order to cover up her happiness, she asks the young man a question. In face of Xuejiejie, the young man is flustered. So he asks you for help.

The question is that :
Define the L技术分享 as the length of the longest common subsequence of X技术分享 and Y技术分享.( The subsequence does not need to be continuous
in the string, and a string of length L技术分享 has 2技术分享L技术分享技术分享 subsequences containing the empty string ). Now Xuejiejie comes up with all subsequences of length L技术分享 of string X技术分享, she wants to know the number of subsequences which is also the subsequence of string Y技术分享.
 

Input
In the first line there is an integer T技术分享, indicates the number of test cases.

In each case:

The first line contains string X技术分享, a non-empty string consists of lowercase English letters.

The second line contains string Y技术分享, a non-empty string consists of lowercase English letters.

1|X|,|Y|1000技术分享, |X|技术分享 means the length of X技术分享.
 

Output
For each test case, output one integer which means the number of subsequences of length L技术分享 of X技术分享 which also is the subsequence of string Y技术分享 modulo 10技术分享9技术分享+7技术分享.
 

Sample Input
2 a b aa ab
 

Sample Output
1 2
 


中文题意:

学姐姐非常喜欢字符串,所以学弟送给了她两个字符串作为礼物。

两个字符串分别为XY。她非常开心,但在开心之余她还想考考学弟。

她定义LXY的最长公共子序列的长度(子序列在字符串内不一定连续,一个长度为L的字符串有2L个子序列,包括空子序列)。

现在学姐姐取出了X的所有长度为L的子序列,并要求学弟回答在这些子序列中,有多少个是Y的子序列。

因为答案可能很大,所以学弟只需要回答最终答案模109+7

官方题解:

技术分享

wei里存的是Y串的前j个字母中,  26个字母最后出现在第几个(字符串下标+1)



#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define MAX_N 1100//再大dp数组会爆的   O(n*m)
char a[MAX_N],b[MAX_N];
int dp[MAX_N+1][MAX_N+1];
int dd[MAX_N+1][MAX_N+1];//b前j个字母中  最后一个 与x[i]
int wei[MAX_N+1][26];//Y前i个字母中 最后一个j字母在的位置
__int64 f[MAX_N+1][MAX_N+1];

int mod=1e9+7;
int main()
{
	int n,m,tem,t;
	scanf("%d",&t);
	while(t--) 
	{
		scanf("%s%s",a,b);
		memset(dp,0,sizeof(dp)); 
		n=strlen(a);
		m=strlen(b);
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<m;j++)
			{
				if(a[i]==b[j]) 
			    	dp[i+1][j+1]=max(dp[i][j]+1,max(dp[i+1][j],dp[i][j+1])); 
				else 
					dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]); 
			}
		}  
		memset(wei,0,sizeof wei); 
		for(int i=1;i<=m;i++)
		{
			for(int j=0;j<26;j++)
				wei[i][j]=wei[i-1][j];
			wei[i][b[i-1]-'a']=i;
		} 
		memset(f,0,sizeof f);
		for(int i=0;i<=n;i++)
		{
			for(int j=0;j<=m;j++)
			{
				if(dp[i][j]==0)
				{
					f[i][j]=1;
					continue;
				}
				if(dp[i-1][j]==dp[i][j]) 
					f[i][j]=(f[i][j]+f[i-1][j])%mod;
				int p=wei[j][a[i-1]-'a'];
				if(p)
				{
					if(dp[i-1][p-1]+1==dp[i][j])
						f[i][j]=(f[i][j]+f[i-1][p-1])%mod;
				}
			}
		}

		printf("%I64d\n",f[n][m]%mod);
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 5282 Senior's String 两次dp

标签:dp

原文地址:http://blog.csdn.net/u013532224/article/details/46848927

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!