博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
p2679 子串
阅读量:6463 次
发布时间:2019-06-23

本文共 1098 字,大约阅读时间需要 3 分钟。

分析

我们可以用dp[i][j][k][0/1]表示A串考虑到第i个,B串考虑到第j个,一共取了k个子串,现在的A[i]是否被选的方案数。我们需要将第一维滚动一下。具体转移见代码。

代码

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;const int mod = 1e9+7;#define add(x,y) x=(x+y)%modint dp[2][1100][210][2],n,m,t;char A[1100],B[1100];int main(){ int i,j,k,now=0; scanf("%d%d%d",&n,&m,&t); scanf("%s",A); scanf("%s",B); for(i=n;i>0;i--)A[i]=A[i-1]; for(i=m;i>0;i--)B[i]=B[i-1]; dp[now][0][0][0]=1; for(i=1;i<=n;i++){ now^=1; memset(dp[now],0,sizeof(dp[now])); dp[now][0][0][0]=1; for(j=1;j<=m;j++) for(k=1;k<=t;k++){ add(dp[now][j][k][0], (dp[now^1][j][k][0]+dp[now^1][j][k][1])%mod); if(A[i]==B[j]){ add(dp[now][j][k][1],dp[now^1][j-1][k][1]); add(dp[now][j][k][1], (dp[now^1][j-1][k-1][0]+dp[now^1][j-1][k-1][1])%mod); }else dp[now][j][k][1]=0; } } printf("%d\n",(dp[now][m][t][1]+dp[now][m][t][0])%mod); return 0;}

转载于:https://www.cnblogs.com/yzxverygood/p/9721899.html

你可能感兴趣的文章
Android二维码扫描、生成
查看>>
查找图标搜索引擎
查看>>
JVM的年轻代GC过程
查看>>
小峰servlet/jsp(6)jstl核心标签库
查看>>
你觉得自己厉害在哪里
查看>>
日期时间工具类
查看>>
五、坐标的概念以及依赖管理
查看>>
zw版【转发·台湾nvp系列Delphi例程】HALCON SetComprise2
查看>>
洛谷P1279 字串距离
查看>>
Bzoj3270 博物馆
查看>>
第三次作业
查看>>
Linq To Sql进阶系列(六)用object的动态查询与保存log篇
查看>>
ie中input光标问题
查看>>
YUI Reset CSS (学习摘抄)
查看>>
listener监听器
查看>>
for循环 Dictionary
查看>>
最长公共子序列
查看>>
工作了几个小时,文件又丢了!!!
查看>>
sql、linq和lambda查询语句比较inner join和group by组合使用及匿名类型的处理
查看>>
PHP调用Com组件
查看>>