LOJ2424 NOIP2015 子串


LINK


题目大意是给你两个序列,在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. 1.oracle 12c基础
  2. RDLC An unexpected error occurred while compiling expressions. Native compiler return value: &#39;-1073741511&#39;
  3. Utrack声卡和机架包的调试
  4. CSS HACK tab制表符导致行内元素之间的空隙如何解决
  5. SQL中order by;group up;like;关联查询join on的用法
  6. JavaScript中的3种弹出式消息提醒(警告窗口,确认窗口,信息输入窗口)的命令是什么?
  7. Floyd算法核心代码证明
  8. English test for certificate
  9. EXPDP IMPDP 知识总结
  10. 【Java】泛型学习笔记
  11. Spring Cloud 微服务开发系列整理
  12. 安装rpm
  13. Python的安装图解
  14. ps命令详解
  15. SVD及其在推荐系统中的作用
  16. js .map方法
  17. [Android Pro] AndroidX了解一下
  18. django表单字段
  19. CSS3:{*zoom:1;}作用
  20. 程序单一实例实现 z

热门文章

  1. python学习笔记glob模块
  2. HttpServlet实现serializable
  3. js从一个select选择数据添加到另一个select(包括移除)
  4. HTML 参考手册- (HTML5 标准)
  5. MongoDB3.xxx 用户创建
  6. 场景设计以及Manual Scenario和Goal-OrientedScenario的区别
  7. 设计模式--适配器模式C++实现
  8. 第六天 文件的基本管理和xfs文进系统备份恢复
  9. 五.dbms_transaction(用于在过程,函数,和包中执行SQL事务处理语句.)
  10. SCM-MANAGER