题目大意:
给出A,B两个串,问A串中有多少个B串
思路:
因为A串可以达到非常大,所以需要用到大数相加。
dp[i][j]表示B中前i个字符在j中的前j个字符中有几个
当i和j是一样的情况下,dp[i][j]等于B的前i个字符在A的前j-1个字符中的个数加上B的前i - 1个字符在A的前j - 1个字符中的个数
dp[i][j] = dp[i][j - 1] + dp[i - 1][ j - 1]
当i和j不一样的情况下,
dp[i][j] = dp[i][j - 1]
代码:
#include <iostream>
using namespace std;
#include <cstring>
#include <stdio.h>
char s1[10002],s2[105];
char dp[101][10001][102];
void add(char * a,char * b,char * c) {
int len1 = strlen(b);
int len2 = strlen(c);
int len3 = max(len1,len2);
memset(a,0,(len3 + 5) * sizeof(a[0]));
for(int i = len1 - 1,j = len3;i >= 0;i--,j--)
a[j] += b[i] - '0';
for(int i = len2 - 1, j = len3; i >= 0; i--,j--)
a[j] += c[i] - '0';
for(int i = len3; i >0 ; a[i] +='0',i--)
if(a[i] > 9) {
a[i] -= 10;
a[i - 1]++;
}
if(!a[0]) {
for(int i = 0; i < len3; i++)
a[i] = a[i + 1];
a[len3] = 0;
}
else
a[0] = '1';
}
int main() {
int T;
scanf("%d",&T);
while(T--) {
gets(s1);
gets(s2);
int len1 = strlen(s1);
int len2 = strlen(s2);
for(int i = 0; i <= len1; i++)
strcpy(dp[0][i],"1");
for(int i = 1; i <= len2; i++) {
strcpy(dp[i][i - 1],"0");
for(int j = i; j <= len1; j++) {
if(s1[j - 1] == s2[i - 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[len2][len1]);
}
return 0;
}