传送门

Solution

DP+滚动数组.

DP状态

$dp[i][j][k]$: $A$的第$i$个字符和$B$的第$j$个字符匹配且该字符在第$k$个子串中的方案数.

转移方程

$dp[0][0][0]=1$

$dp[i][j][k] = dp[i-1][j-1][k] + \sum\limits _{0\le i' <i} dp[i'][j-1][k-1]$

用数组$sum[j][k]$维护转移时用到的那个和$\sum\limits _{0\le i' <i} dp[i'][j-1][k-1]$.

三维数组会MLE, 要用滚动数组优化成二维, 把第一维去掉.

Implementation

注意计算的顺序

#include <bits/stdc++.h>
using namespace std; const int N=1005, M=205, K=205, mod=1e9+7; int dp[M][K]; char a[N], b[N]; int sum[M][K]; int main(){
int n, m, K;
scanf("%d%d%d", &n, &m, &K);
scanf("%s%s", a+1, b+1);
dp[0][0]=1;
sum[0][0]=1; for(int i=1; i<=n; i++){
for(int j=m; j>0; j--){
if(a[i]!=b[j]){
for(int k=1; k<=K; k++)
dp[j][k]=0;
}
else{
for(int k=1; k<=K; k++){
dp[j][k]=(dp[j-1][k]+sum[j-1][k-1])%mod;
sum[j][k]+=dp[j][k];
sum[j][k]%=mod;
}
}
}
} printf("%d\n", sum[m][K]);
return 0;
}

最新文章

  1. python读取excel一例-------从工资表逐行提取信息
  2. Android RecyclerView 使用完全解析
  3. 用dom操作替代正则表达式
  4. 18SpringMvc_在业务控制方法中收集数组参数
  5. 【Java多线程与并发库】4.传统线程同步通信技术
  6. jiaocheng https://github.com/CarpenterLee/JCFInternals
  7. C# foreach获取集合元素索引的坑
  8. 【JavaScript】强制缓存刷新
  9. HTML5游戏开发实战--当心
  10. 【IE6的疯狂之十三】IE6下使用滤镜后链接不能点击的BUG
  11. html超文本标记语言的由来
  12. 支付-stripe
  13. 《程序猿闭门造车》之NBPM工作流引擎 - 开篇
  14. 集合之HashSet(含JDK1.8源码分析)
  15. python排序 sorted()与list.sort() (转)
  16. javaweb项目中errorPage的问题
  17. windows linux hosts文件的配置,开发项目中域名跳转等。
  18. Storm 安装部署
  19. go语言之进阶篇接口的继承
  20. 【Android】OAuth验证和新浪微博的oauth实现

热门文章

  1. TinyFrame尾篇:整合Spring AOP实现用户认证
  2. 理解Android虚拟机体系结构
  3. 青瓷引擎使用心得——修改引擎的loading界面
  4. C#访问Azure的资源
  5. JavaWeb之jsp编译为java源码的文件地址
  6. oracle递归查询树的SQL语句
  7. MyBatis学习--高级映射
  8. 直播CDN架构随想
  9. python之旅【第一篇】
  10. GIF/PNG/JPG和WEBP/base64/apng图片优点和缺点整理