题意:
b在a中可不连续出现但按顺序出现的次数
思路:
dp[i][j][k]表示前j个b在前i个a中出现的次数,最后一位是用于大数统计
那么一遇到相同的,就有递推公式
dp[i][j] = dp[i][j-1]+dp[i-1][j-1](汇集j-1)
代码:
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int maxn = 10010;
char save1[maxn], save2[120];
int dp[120][maxn][30];
void add(int i, int j) {
for(int k=1; k<=30; k++) {
dp[i][j][k+1] += (dp[i][j-1][k]+dp[i-1][j-1][k])/10000;
dp[i][j][k] += (dp[i][j-1][k]+dp[i-1][j-1][k])%10000;
}
return;
}
int main() {
int cas;
scanf("%d", &cas);
while(cas--) {
scanf("%s%s", save1, save2);
int len1 = strlen(save1);
int len2 = strlen(save2);
memset(dp, 0, sizeof(dp));
for(int j=0; j<=len1; j++) dp[0][j][1] = 1;
for(int i=1; i<=len2; i++)
for(int j=1; j<=len1; j++) {
if(save2[i-1] == save1[j-1]) {
add(i, j);
}
else {
for(int k=1; k<=30; k++)
dp[i][j][k] = dp[i][j-1][k];
}
}
int i;
for(i=30;dp[len2][len1][i]==0&&i>=1;i--)
;
printf("%d",dp[len2][len1][i]);
i--;
for(;i>=1;i--)
printf("%04d",dp[len2][len1][i]);
putchar('\n');
}
return 0;
}