P2679-子串【dp】
生活随笔
收集整理的這篇文章主要介紹了
P2679-子串【dp】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目鏈接:https://www.luogu.com.cn/problem/P2679
題目大意
長度為nnn的字符串AAA和長度為mmm的字符串BBB,要求從AAA中截取kkk個不重復的非空子串使得他們按順序拼接起來是字符串BBB。求方案數。
解題思路
設fi,j,k,0/1f_{i,j,k,0/1}fi,j,k,0/1?表示AAA到第iii個位置,BBB到第jjj個位置,目前截取了kkk段,這個位置iii有沒有被截取時的方案數。轉移顯然
時間復雜度O(nmk)O(nmk)O(nmk)
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const int XJQ=1e9+7; ll n,m,k,f[2][201][201][2]; char a[1100],b[1100]; int main() {scanf("%lld%lld%lld",&n,&m,&k);scanf("%s",a+1);scanf("%s",b+1);f[0][0][0][0]=1;for(ll i=1;i<=n;i++){memset(f[i&1],0,sizeof(f[i&1]));for(ll j=0;j<=m;j++)for(ll k=0;k<=m;k++){if(j&&a[i]==b[j]){if(k)(f[i&1][j][k][1]+=f[~i&1][j-1][k-1][0])%=XJQ;if(k)(f[i&1][j][k][1]+=f[~i&1][j-1][k-1][1])%=XJQ;(f[i&1][j][k][1]+=f[~i&1][j-1][k][1])%=XJQ;}(f[i&1][j][k][0]+=f[~i&1][j][k][0])%=XJQ;(f[i&1][j][k][0]+=f[~i&1][j][k][1])%=XJQ;}}printf("%lld",(f[n&1][m][k][0]+f[n&1][m][k][1])%XJQ); }總結
以上是生活随笔為你收集整理的P2679-子串【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 首次装电脑之前何不先模拟一番,这款练手神
- 下一篇: P6834-[Cnoi2020]梦原【数