Medium Counting

C++动态规划算法解析
本文深入探讨了使用C++实现动态规划算法解决字符串匹配问题的方法。通过具体代码示例,详细讲解了如何利用递归函数和动态规划矩阵优化算法效率,解决了包含通配符的字符串匹配难题。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
const int N=55,L=22,C=33,mod=990804011;
char s[N][L];
int n,m,dp[N][N][L][C],a[N][L];
inline int dfs(int l,int r,int p,int c)
{
 int &f=dp[l][r][p][c];
 if(~f)
  return f;
 if(l>r)
  return f=1;
 if(p>m)
  return f=(l==r);
 if(c>26)
  return f=0;
 f=dfs(l,r,p,c+1); 
 for(int i=l;i<=r;i++)
 {
  if(!(a[i][p]==c||(a[i][p]==27&&c)))
   break;
  f=(f+1ll*dfs(l,i,p+1,0)*dfs(i+1,r,p,c+1))%mod;
 }
 return f;
}
int main()
{
 scanf("%d",&n);
 memset(dp,-1,sizeof(dp));
 for(int i=1,l;i<=n;i++)
 {
  scanf("%s",s[i]+1);
  m=max(m,l=strlen(s[i]+1));
  for(int j=1;j<=l;j++)
  {
   if(s[i][j]=='?')
    a[i][j]=27;
   else 
    a[i][j]=s[i][j]-'a'+1;
  }
 }
 printf("%d\n",dfs(1,n,1,0));
 return 0;
}

来源:zr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值