1、http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=1010
2、数据好大,longlong也不对,用大数相加
dp[i][j]表示b的前i个字符在a的前j个字符中出现的次数
状态转移方程;
if(b[i-1]==a[j-1])//如果b的第i个字符和a的第j个字符相同,那么dp[i][j]=dp[i][j-1]+dp[i-1][j-1]
else
dp[i][j]=dp[i][j-1];
题目大意;
给定两个序列a,b,求出a中有多少个b序列,只要顺序相同即可, 不必要连续
题目;
Problem E
distinct Subsequences
Input: standard input
Output: standard output
A subsequence of a given sequence is just the given sequence with some elements (possibly none) left out. Formally,given a sequence X =x1x2…xm,another sequence Z = z1z2…zk is a subsequence of X if there exists a strictly increasing sequence <i1, i2,…, ik> of indices of Xsuch that for all j = 1,2, k,we have xij = zj. For example, Z = bcdb is a subsequence of X = abcbdab with corresponding index sequence< 2,3,5,7 >.
In this problem your job is to write a program that counts the number of occurrences of Z in X as a subsequence such that each has a distinct index sequence.
Input
The first line of the input contains an integer N indicating the number of test cases to follow.
The first line of each test case contains a string X,composed entirely of lowercase alphabetic characters and having length no greater than 10,000. The second line contains another string Z having length no greater than 100 and also composed of only lowercase alphabetic characters. Be assured that neither Z nor any prefix or suffix of Z will have more than 10100 distinct occurrences in X as a subsequence.
Output
For each test case in the input output the number of distinct occurrences of Z in X as a subsequence. Output for each input set must be on a separate line.
Sample Input
2babgbag
bag
rabbbit
rabbit
Sample Output
53
Rezaul Alam Chowdhury
4、AC代码:
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; char a[10005]; char b[105]; char dp[105][10005][105]; void add(char *c,char *a,char *b) { int la=strlen(a); int lb=strlen(b); int lc=max(la,lb); memset(c,(lc+2)*sizeof(c[0])); for(int i=la-1,j=lc;i>=0;i--,j--) c[j]+=a[i]-'0'; for(int i=lb-1,j--) c[j]+=b[i]-'0'; for(int i=lc;i>0;c[i]+='0',i--) { if(c[i]>9) { c[i]-=10; c[i-1]++; } } if(!c[0]) { for(int i=0;i<lc;i++) c[i]=c[i+1]; c[lc]=0; } else c[0]='1'; } int main() { int t; scanf("%d",&t); while(t--) { scanf("%s%s",a,b); int la=strlen(a); int lb=strlen(b); for(int i=0;i<=la;i++) strcpy(dp[0][i],"1"); for(int i=1;i<=lb;i++) { for(int j=i;j<=la;j++) { if(b[i-1]==a[j-1]) add(dp[i][j],dp[i-1][j-1],dp[i][j-1]); else strcpy(dp[i][j],dp[i][j-1]); } } printf("%s\n",dp[lb][la]); } return 0; }超时代码:(思路对,加上大数相加即可)
#include<stdio.h> #include<string.h> #define N 10005 char a[N]; char b[105]; int dp[105][N];//dp[i][j]表示子串的前i个字符在母串的前j个字符中出现的次数 int main() { int t; scanf("%d",b); int la=strlen(a); int lb=strlen(b); memset(dp,sizeof(dp)); for(int i=0;i<=la;i++) dp[0][i]=1; for(int i=1;i<=lb;i++) { for(int j=i;j<=la;j++) { if(a[j-1]==b[i-1]) dp[i][j]=dp[i-1][j-1]+dp[i][j-1]; else dp[i][j]=dp[i][j-1]; } } printf("%d\n",dp[lb][la]); } return 0; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。