日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P2679-子串【dp】

發布時間:2023/12/3 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。