牛客多校第五场G
2024-09-05 02:55:39
只要处理长度等于t的.
转移方程没想出来QAQ
$dp(i,j,0)$代表到$s[i]$为止有多少个前缀序列与$t[0\cdots j]$相同
所以有$dp(i,j,0)=dp(i-1,j,0)+s[i]==t[j]?dp(i-1,j-1,0):0;$
$dp(i,j,1)$代表到$s[i]$为止有多少个子序列大于$t[0\cdots j]$
故有$dp(i,j,1)=dp(i-1,j,1)+(s[i]>t[j])*dp(i,j-1,0)+(j>0)*dp(i-1,j-1,0)$
#include<bits/stdc++.h>
using namespace std;
char s[],t[];
typedef long long ll;
ll dp[][][];
ll C[][];
ll mod=;
void init()
{
for(int i=;i<;i++){
C[i][i]=;
C[i][]=;
}
for(int i=;i<;i++){
for(int j=i+;j<;j++){
C[j][i]=(C[j-][i-]+C[j-][i])%mod;
}
}
}
int main()
{
int T;
int n,m;
ll ans;
init();
scanf("%d",&T);
while(T--){
ans=;
scanf("%d%d",&m,&n);
scanf("%s",s);
scanf("%s",t);
for(int i=;i<=max(m,n);i++)
dp[i][][]=dp[i][][]=;
// for(int i=0;i<=n;i++)dp[0][i]=1;
for(int i=;i<m;i++){
for(int j=;j<n;j++){ dp[i+][j+][]=((dp[i][j][])*(s[i]==t[j])+dp[i][j+][])%mod;
dp[i+][j+][]=(dp[i][j+][]+(s[i]>t[j])*dp[i][j][]+(j>)*dp[i][j][])%mod;
// cout<<dp[i+1][j+1][1]<<' ';
}
// cout<<'\n';
// cout<<i<<" "<<ans<<'\n';
}
ans=dp[m][n][];
//cout<<ans<<'\n';
for(int k=n+;k<=m;k++)
for(int i=;i+k-<=m;i++){
if(s[i-]!='')
ans=(ans+C[m-i][k-])%mod;
}
cout<<ans<<'\n'; }
}
最新文章
- chrome新版安装flash控件失败解决方法
- jQuery正则的使用方法步骤详解
- Caffe+CUDA7.5+CuDNNv3+OpenCV3.0+Ubuntu14.04 配置参考文献 以及 常见编译问题总结
- css选择器([class*="; icon-";], [class^=icon-] 的区别)
- android 拍照或者图库选择 压缩后 图片 上传
- 通过Bresenham算法实现完成矢量线性多边形向栅格数据的转化
- HTML特殊符号对照表(转)
- 设置图层符号风格为用已有mxd里的同名图层风格
- 剑指Offer:第一个只出现一次的字符
- FRM-40401 No changes to save error
- Mac系统Safari浏览器启动无图模式
- [转] 智能指针(三):unique_ptr使用简介
- 实现基于tomcat集群会话保持
- [DP]P2890 [USACO07OPEN]便宜的回文Cheapest Palindrome
- js var 以及 let 的差异
- Json.net日期格式化设置
- [P2704][NOI2001]炮兵阵地 (状态压缩)
- Linux 小知识翻译 - 「桌面环境」
- [MyBatis] MyBatis理论入门
- bzoj千题计划260:bzoj2940: [Poi2000]条纹