UVA - 10069 Distinct Subsequences 不同子序列

来源:互联网 发布:php微信公众号源码 编辑:程序博客网 时间:2024/04/28 14:56

题目大意:给出两个字符串,要求求出字符串1的有多少的子串是字符串2

解题思路:这题的数据很大,高达10^100,得用大数据的加法,用dp[i][j]表示长度为j的字符串有多少种表示长度为i的字符串,那样就可推出转换方程

1.如果长度为i的字符串的最后一个字符和长度为j的字符串的最后一个字符相同的话,则dp[i][j] = dp[i][j-1]+dp[i-1][j-1]

2.如果不相同的话,dp[i][j] = dp[i][j-1]

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define maxn 10005char dp[105][10005][105];char a[maxn];char b[105];int len1,len2;void add(char *c,char *a,char *b) {int l1 = strlen(a);int l2 = strlen(b);int l3 = max(l1,l2);memset(c,0,sizeof(c[0])*(l3+2));for(int i = l1 - 1,j = l3; i >= 0; i--,j--)c[j] += a[i] - '0';for(int i = l2 - 1,j = l3; i >= 0; i--,j--)c[j] += b[i] - '0';for(int i = l3; i > 0 ;c[i] = c[i] + '0',i--)if(c[i] > 9) {c[i] -= 10;c[i-1]++;}if(!c[0]) {for(int i = 0; i < l3; i++)c[i] = c[i+1];c[l3] = 0;}else c[0] = '1';}int main() {int test;scanf("%d", &test);while(test--){scanf("%s%s",a,b);len1 = strlen(a);len2 = strlen(b);for(int i = 0 ; i <= len1; i++)strcpy(dp[0][i],"1");for(int i = 1; i <= len2; i++)for(int j = i; j <= len1; j++) if(b[i-1] == a[j-1]) add(dp[i][j],dp[i][j-1],dp[i-1][j-1]);elsestrcpy(dp[i][j],dp[i][j-1]);printf("%s\n",dp[len2][len1]);}return 0;}


0 0
原创粉丝点击