LOJ2424 NOIP2015 子串 【DP】*
2024-10-16 00:56:34
LOJ2424 NOIP2015 子串
题目大意是给你两个序列,在a序列中选出k段不重叠的子串组成b序列,问方案数
首先我们不考虑相邻的两段,把所有相邻段当成一段进行计算
然后设dpi,j,k,0/1表示a使用了i为,b匹配到j位,一共有k段,当前这一位选不选的方案数
然后转移显然:
dpi,j,k,0=dpi−1,j,k,0+dpi−1,j,k,1
dpi,j,k,1=dpi−1,j−1,k,1+dpi−1,j−1,k−1,0(条件ai=bja_i=b_jai=bj)
然后之后的dp就非常显然了
把i滚动数组掉就可以了
然后注意数组清零和j和k的枚举下界是0。。。
#include<bits/stdc++.h>
using namespace std;
const int Mod=1e9+;
const int N=1e3+,M=2e2+;
#define fu(a,b,c) for(int a=b;a<=c;a++)
int dp[][M][M][];
int c[N][N];
int n,m,k,ind=;
char a[N],b[N];
int add(int a,int b){return (a+b)%Mod;}
int mul(int a,int b){return 1ll*a*b%Mod;}
void init() {
fu(i,,n)c[i][]=;
fu(i,,n)fu(j,,i)c[i][j]=add(c[i-][j],c[i-][j-]);
}
int main() {
scanf("%d%d%d",&n,&m,&k);
scanf("%s%s",a+,b+);
init();
dp[ind][][][]=;
fu(i,,n) {
ind^=;
memset(dp[ind],,sizeof(dp[ind]));
fu(j,,min(i,m))
fu(k,,j) {
dp[ind][j][k][]=add(dp[ind^][j][k][],dp[ind^][j][k][]);
if(k==||j==||a[i]!=b[j])continue;
dp[ind][j][k][]=add(dp[ind^][j-][k][],dp[ind^][j-][k-][]);
}
}
int ans=;
fu(i,,k)ans=add(ans,mul(add(dp[ind][m][i][],dp[ind][m][i][]),c[m-i][k-i]));
printf("%d",ans);
return ;
}
最新文章
- 1.oracle 12c基础
- RDLC An unexpected error occurred while compiling expressions. Native compiler return value: &#39;-1073741511&#39;
- Utrack声卡和机架包的调试
- CSS HACK tab制表符导致行内元素之间的空隙如何解决
- SQL中order by;group up;like;关联查询join on的用法
- JavaScript中的3种弹出式消息提醒(警告窗口,确认窗口,信息输入窗口)的命令是什么?
- Floyd算法核心代码证明
- English test for certificate
- EXPDP IMPDP 知识总结
- 【Java】泛型学习笔记
- Spring Cloud 微服务开发系列整理
- 安装rpm
- Python的安装图解
- ps命令详解
- SVD及其在推荐系统中的作用
- js .map方法
- [Android Pro] AndroidX了解一下
- django表单字段
- CSS3:{*zoom:1;}作用
- 程序单一实例实现 z
热门文章
- python学习笔记glob模块
- HttpServlet实现serializable
- js从一个select选择数据添加到另一个select(包括移除)
- HTML 参考手册- (HTML5 标准)
- MongoDB3.xxx 用户创建
- 场景设计以及Manual Scenario和Goal-OrientedScenario的区别
- 设计模式--适配器模式C++实现
- 第六天 文件的基本管理和xfs文进系统备份恢复
- 五.dbms_transaction(用于在过程,函数,和包中执行SQL事务处理语句.)
- SCM-MANAGER