solution : 就按题解敲了一遍,好久没写这种dp
1 #include <cstdio>
2 #include <cstring>
3 #include < string>
4 #include <vector>
5 #include <algorithm>
6 #include <iostream>
7 using namespace std;
8 typedef long long LL;
9 const int MAX = 1e3+ 10;
10 const int MOD = 1e9+ 7;
11 int dp[MAX][MAX];
12 LL f[MAX][MAX];
13 int Next[ 30];
14 char a[MAX],b[MAX];
15 int main() {
16 int cas;
17 scanf( " %d ",&cas);
18 while(cas--) {
19 scanf( " %s %s ",a+ 1,b+ 1);
20 memset(dp, 0, sizeof(dp));
21 int n=strlen(a+ 1);
22 int m=strlen(b+ 1);
23 for( int i= 1;i<=n;i++) {
24 for( int j= 1;j<=m;j++) {
25 if(a[i]==b[j]) {
26 dp[i][j]=max(dp[i][j],dp[i- 1][j- 1]+ 1);
27 }
28 else {
29 dp[i][j]=max(dp[i][j- 1],dp[i- 1][j]);
30 }
31 }
32 }
33 memset(f, 0, sizeof(f));
34 for( int i= 0;i<=n;i++) {
35 memset(Next, 0, sizeof(Next));
36 for( int j= 0;j<=m;j++) {
37 if(dp[i][j]== 0) {
38 f[i][j]= 1;
39 }
40 else {
41 Next[b[j]- ' a ']=j;
42 if(dp[i- 1][j]==dp[i][j]) {
43 f[i][j]=(f[i][j]+f[i- 1][j])%MOD;
44 }
45 if(Next[a[i]- ' a ']) {
46 int p=Next[a[i]- ' a '];
47 if(p&&dp[i- 1][p- 1]+ 1==dp[i][j]) {
48 f[i][j]=(f[i][j]+f[i- 1][p- 1])%MOD;
49 }
50 }
51 }
52 }
53 }
54 cout<<f[n][m]<<endl;
55 }
2 #include <cstring>
3 #include < string>
4 #include <vector>
5 #include <algorithm>
6 #include <iostream>
7 using namespace std;
8 typedef long long LL;
9 const int MAX = 1e3+ 10;
10 const int MOD = 1e9+ 7;
11 int dp[MAX][MAX];
12 LL f[MAX][MAX];
13 int Next[ 30];
14 char a[MAX],b[MAX];
15 int main() {
16 int cas;
17 scanf( " %d ",&cas);
18 while(cas--) {
19 scanf( " %s %s ",a+ 1,b+ 1);
20 memset(dp, 0, sizeof(dp));
21 int n=strlen(a+ 1);
22 int m=strlen(b+ 1);
23 for( int i= 1;i<=n;i++) {
24 for( int j= 1;j<=m;j++) {
25 if(a[i]==b[j]) {
26 dp[i][j]=max(dp[i][j],dp[i- 1][j- 1]+ 1);
27 }
28 else {
29 dp[i][j]=max(dp[i][j- 1],dp[i- 1][j]);
30 }
31 }
32 }
33 memset(f, 0, sizeof(f));
34 for( int i= 0;i<=n;i++) {
35 memset(Next, 0, sizeof(Next));
36 for( int j= 0;j<=m;j++) {
37 if(dp[i][j]== 0) {
38 f[i][j]= 1;
39 }
40 else {
41 Next[b[j]- ' a ']=j;
42 if(dp[i- 1][j]==dp[i][j]) {
43 f[i][j]=(f[i][j]+f[i- 1][j])%MOD;
44 }
45 if(Next[a[i]- ' a ']) {
46 int p=Next[a[i]- ' a '];
47 if(p&&dp[i- 1][p- 1]+ 1==dp[i][j]) {
48 f[i][j]=(f[i][j]+f[i- 1][p- 1])%MOD;
49 }
50 }
51 }
52 }
53 }
54 cout<<f[n][m]<<endl;
55 }
56 }