题意:求一个串的子串出现在母串的个数,,i表示子串的长度,j表示母串的长度,当str1[i] != str[j],dp[i][j] = dp[i][j-1],因为如果这两个字符不相等的话,那么就等于子串与长度为j-1的母串的情况,当str1[i] == str[j]。那么dp[i][j] = dp[i][j-1]+dp[i-1][j-1],相等的话,那么就等于与长度为j-1的母串的个数加上dp[i-1][j-1].
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char dp[101][10001][102],str1[10002],str2[101];
void ADD(char *c,char *a,char *b){
int len_a = strlen(a);
int len_b = strlen(b);
int len_c = max(len_a,len_b);
int A[105],B[105],C[105];
memset(C,0,sizeof(C));
memset(A,0,sizeof(A));
memset(B,0,sizeof(B));
memset(c,0,(len_c+2)*sizeof(c[0]));
for (int i = 0; i < len_a; i++)
A[len_a-1-i] = a[i] - '0';
for (int i = 0; i < len_b; i++)
B[len_b-1-i] = b[i] - '0';
for (int i = 0; i < len_c; i++){
C[i] += A[i] + B[i];
C[i+1] += C[i] / 10;
C[i] %= 10;
}
while (C[len_c] == 0 && len_c > 0)
len_c--;
for (int i = len_c; i >= 0; i--)
c[len_c - i] = C[i] + '0';
}
int main(){
int num;
scanf("%d",&num);
while (num--){
scanf("%s%s",str1,str2);
int len1 = strlen(str1),len2 = strlen(str2);
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 (str1[j-1] == str2[i-1])
ADD(dp[i][j],dp[i][j-1],dp[i-1][j-1]);
else strcpy(dp[i][j],dp[i][j-1]);
}
}
printf("%s\n",dp[len2][len1]);
}
return 0;
}