[UOJ#149][NOIP2015]子串(dp)
来源:互联网 发布:夸奖男人网络词 编辑:程序博客网 时间:2024/06/06 07:46
题目描述
传送门
题解
设f(i,j,k)表示从a的前j个字符中选i段连接起来可以和b的前k个匹配的方案数。可以预处理出来g(i,j)表示a的第i个字符和b的第j个字符从后往前最多能匹配多少个。
那么
可以肯定的是dp是三维状态的,而且是
其实优化都比较简单。空间上可以发现f(i)只与f(i-1)有关,可以用滚动数组。时间上发现转移的时候是加了一段连续的和,可以使用前缀和优化。如果把f(i)中的两维看成一个二维平面的话,这里的前缀和应该是点(x,y)一直向左上角走直到不能走为止所经过的点的和。
时间复杂度
代码
#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define N 1005#define M 205#define Mod 1000000007int n,m,p;int f[2][N][M],s[2][N][M],g[N][M];char a[N],b[M];void init(){ for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) { g[i][j]=min(i,j); for (int k=1;k<=min(i,j);++k) if (a[i-k+1]!=b[j-k+1]) { g[i][j]=k-1; break; } }}int main(){ scanf("%d%d%d\n",&n,&m,&p); gets(a+1);gets(b+1); init(); for (int i=1;i<=m;++i) for (int j=i;j<=n;++j) { f[1][j][i]=f[1][j-1][i]; if (g[j][i]==i) f[1][j][i]++; s[1][j][i]=s[1][j-1][i-1]+f[1][j][i]; } for (int i=2;i<=p;++i) { memset(f[i&1],0,sizeof(f[i&1])); memset(s[i&1],0,sizeof(s[i&1])); for (int j=1;j<=n;++j) for (int k=1;k<=m;++k) { f[i&1][j][k]=f[i&1][j-1][k]; if (g[j][k]) { int x=s[(i-1)&1][j-1][k-1]; f[i&1][j][k]=(f[i&1][j][k]+s[(i-1)&1][j-1][k-1])%Mod; int J=max(j-g[j][k]-1,0),K=max(k-g[j][k]-1,0); int y=s[(i-1)&1][J][K]; f[i&1][j][k]=((f[i&1][j][k]-s[(i-1)&1][J][K])%Mod+Mod)%Mod; } s[i&1][j][k]=(s[i&1][j-1][k-1]+f[i&1][j][k])%Mod; } } printf("%d\n",f[p&1][n][m]);}
0 0
- [UOJ#149][NOIP2015]子串(dp)
- 【uoj#149】【NOIP2015】子串 DP
- 【UOJ#149】【NOIP2015】子串【计数DP】
- 【DP】UOJ#149 【NOIP2015】子串
- [noip2015]子串(dp)
- 【noip2015】【DP】子串
- NOIP2015 子串 DP
- noip2015 子串 dp
- NOIP2015 子串 dp
- [DP] NOIP2015 子串
- NOIP2015 子串 解题报告(DP)
- Noip2015 Day1 T2 子串(Dp)
- UOJ149【NOIP2015】子串 (DP)
- NOIP2015 子串【DP】【NOIP】
- UOJ 149 子串
- code vs 4560 NOIP2015 D2T2 子串 (dp)
- 【codevs 4560】[NOIP2015 D2T2]子串(dp)
- 洛谷 2676 [NOIP2015] 子串 DP
- 获取手机信息
- php导出csv类
- java日期格式化。创建文件的随机日期名称。
- 分数拆分
- 五、HTML基础之添加图像
- [UOJ#149][NOIP2015]子串(dp)
- 6天通吃树结构—— 第五天 Trie树
- 初入pcl之ICP算法简介
- Javascript 强制类型转换函数
- kmeans和kmeans++算法的区别
- 多线程总结
- 【图像识别】【读论文】模式识别方法概论&&模式识别及其在图像处理中的应用
- Xcode 8带来的新特性和坑
- oracel system账户解锁命令