P2679 子串
Posted popo-black-cat
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2679 子串相关的知识,希望对你有一定的参考价值。
这题真不错,需要三维dp,转移方程为我好久才想出来。
然后发现数组开不下……
emmm……
于是乎我看了题解,才想起来我会滚动数组,,,qwq
这道题的关键就是,对于这个第 i 位是和上一个合并还是单独新开一个串,那么对于上述两种情况,就要对应必须选第 i 个或者第 i 个可选可不选(即现有最优解)。
代码如下:
#include<cstdio> #include<iostream> using namespace std; #define mod 1000000007 int n,m,k,now,pre; int ans[3][1005][1005],res[3][1005][1005]; char a[1005],b[1005]; int main() { scanf("%d%d%d",&n,&m,&k); scanf("%s%s",a+1,b+1); ans[0][0][0]=1,now=1,pre=0; for(int i=1;i<=n;i++) { ans[now][0][0]=1; for(int j=1;j<=m;j++) for(int p=1;p<=k;p++) { if(a[i]==b[j]) res[now][j][p]=(res[pre][j-1][p]+ans[pre][j-1][p-1])%mod; else res[now][j][p]=0; ans[now][j][p]=(res[now][j][p]+ans[pre][j][p])%mod; } pre=now; now^=1; } printf("%d",ans[now^1][m][k]); return 0; }
dp代码就是短小精悍啊~
以上是关于P2679 子串的主要内容,如果未能解决你的问题,请参考以下文章