BestCoder Round #47 1003

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     }

56 } 

转载于:https://www.cnblogs.com/acvc/p/4640724.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值