博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【NOIP】提高组2015 子串
阅读量:6432 次
发布时间:2019-06-23

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

【题意】求从字符串A中取出k个互不重叠的非空子串顺序拼接形成B的方案数。n<=1000,m<=100,k<=m。

【算法】动态规划

【题解】这题主要是将从i-l转移变成从i-1转移,从而省略l这一维的枚举(等价于记录前缀和,将信息顺序传递过来)。

f[i][j][k]表示字符串A到i,字符串B到j,已用k个子串的方案数,特别地,g[i][j][k]表示选择A[i]的前提下字符串A到i,字符串B到j,已用k个子串的方案数。

g[i][j][k]=f[i-1][j-1][k-1]+g[i-1][j-1][k],A[i]=B[j]  新开一个子串(k-1)或不新开(k)

f[i][j][k]=g[i][j][k]+f[i-1][j][k]  选择或不选择

#include
#include
#include
#include
using namespace std;const int maxn=1010,maxm=210,MOD=1e9+7;int f[2][maxm][maxm],g[2][maxm][maxm],n,m,kind;char A[maxn],B[maxm];int MO(int x){
return x>=MOD?x-MOD:x;}int main(){ scanf("%d%d%d",&n,&m,&kind); scanf("%s%s",A+1,B+1); int x=0; f[0][0][0]=f[1][0][0]=1; for(int i=1;i<=n;i++){ x=1-x; for(int j=1;j<=m;j++){ for(int k=1;k<=kind;k++){ if(k>j){f[x][j][k]=g[x][j][k]=0;continue;} if(A[i]==B[j])g[x][j][k]=MO(f[1-x][j-1][k-1]+g[1-x][j-1][k]);else g[x][j][k]=0; f[x][j][k]=MO(g[x][j][k]+f[1-x][j][k]); } } } printf("%d",f[x][m][kind]); return 0;}
View Code

 

转载于:https://www.cnblogs.com/onioncyc/p/7776407.html

你可能感兴趣的文章
Centos6.5下安装protobuf及简单使用
查看>>
[SharePoint] SharePoint 错误集 3
查看>>
高压光耦
查看>>
[转]DPM2012系列之六:在Win7上安装DPM远程管理控制台
查看>>
postgres函数
查看>>
Microsoft AJAX Library Cheat Sheet(5): Number和Error类型的扩展
查看>>
AfxGetMainWnd函数
查看>>
WebView增加一个水平Progress,位置、长相随意
查看>>
easyui messager alert 三秒后自动关闭提示
查看>>
core data 基础操作
查看>>
ORM框架Hibernate (四) 一对一单向、双向关联映射
查看>>
20140616 科技脉搏 -最大颠覆来自创业公司与边缘产业
查看>>
offsetLeft, offsetTop以及postion().left , postion().top有神马区别
查看>>
数据库中触发器before与after认识
查看>>
手动露天广场和立方体
查看>>
随机选择
查看>>
【Java并发编程三】闭锁
查看>>
分布式事务中遇到的 “与基础事务管理器的通信失败”的解决方法
查看>>
让你的Git水平更上一层楼的10个小贴士
查看>>
c++ string 之 find_first_not_of 源码
查看>>