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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[XSY] 宝藏(LCS,DP)

發布時間:2023/12/3 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [XSY] 宝藏(LCS,DP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寶藏

首先,這個問題等價于給定兩個字符串S,T ,每次詢問LCS(S[1,n],T[x,y])LCS(S[1,n],T[x,y])LCS(S[1,n],T[x,y])
對每個詢問重新求一遍LCSLCSLCS顯然不現實,又因為yyy都是連續變化的,我們考慮探討
LCS(S[1,n],T[x,y])與LCS(S[1,n],T[x,y?1])的關系:\color{Red}{LCS(S[1,n],T[x,y])與LCS(S[1,n],T[x,y-1])的關系:}LCS(S[1,n],T[x,y])LCS(S[1,n],T[x,y?1])

其實很明顯LCS(S[1,n],T[x,y])=LCS(S[1,n],T[x,y?1])或LCS(S[1,n],T[x,y?1])+1LCS(S[1,n],T[x,y])=LCS(S[1,n],T[x,y-1])或LCS(S[1,n],T[x,y-1])+1LCS(S[1,n],T[x,y])=LCS(S[1,n],T[x,y?1])LCS(S[1,n],T[x,y?1])+1
相等的情況可以不用管,我們只要關注什么情況下加上yyy后匹配數會+1

設一個大寫字母代表定義一個字符串,一個小寫字母代表定義一個字符

引理
所有滿足LCS(S,Py)=LCS(S,P)+1LCS(S,Py)=LCS(S,P)+1LCS(S,Py)=LCS(S,P)+1的位置構成T的一個后綴
證明
LCS(S,Py)=LCS(S,P)+1LCS(S,Py)=LCS(S,P)+1LCS(S,Py)=LCS(S,P)+1
LCS(S,Gy)=LCS(S,G)+1LCS(S,Gy)=LCS(S,G)+1LCS(S,Gy)=LCS(S,G)+1(GGGPPP的后綴)
SSS中至少有一個yyyPPP匹配不到的,
GGG也是匹配不到這個yyy的,所以多加一個yyy一定會讓匹配數+1

也就是說,假設iii是滿足LCS(S,T[i,y])=LCS(S,T[i,y?1])+1LCS(S,T[i,y])=LCS(S,T[i,y-1])+1LCS(S,T[i,y])=LCS(S,T[i,y?1])+1的位置中最靠前的,那么
?j>=i滿足LCS(S,T[j,y])=LCS(S,T[j,y?1])+1\forall j>=i滿足LCS(S,T[j,y])=LCS(S,T[j,y-1])+1?j>=i滿LCS(S,T[j,y])=LCS(S,T[j,y?1])+1
也就是說,只要我們找到這個位置最靠前的iii,便能找到所有jjj

現在就可以考慮 dp 了。設f(i,j)f(i,j)f(i,j)表示考慮了SSS長度為iii的前綴、TTT長度為jjj的前綴,T[1,j]T[1,j]T[1,j] 最長的后綴PyPyPy滿足LCS(S[1,i],Py)=LCS(S[1,i],P)+1LCS(S[1,i],Py)=LCS(S[1,i],P)+1LCS(S[1,i],Py)=LCS(S[1,i],P)+1f(i,j)f(i,j)f(i,j)表示PyPyPy的起始位置。

考慮f(i,j)f(i,j)f(i,j)的轉移:
先把LCSLCSLCS的轉移式打出來:
LCSi,j={LCSi?1,j?1+1(S[i]==T[j])max{LCSi?1,j,LCSi,j?1}(S[i]!=T[j])LCS_{i,j}=\left\{ \begin{aligned} &LCS_{i-1,j-1}+1(S[i]==T[j]) \\ & max\{LCS_{i-1,j},LCS_{i,j-1}\} (S[i]!=T[j])\\ \end{aligned} \right. LCSi,j?={?LCSi?1,j?1?+1(S[i]==T[j])max{LCSi?1,j?,LCSi,j?1?}(S[i]!=T[j])?
S[i]=yS[i]=yS[i]=y
則根據LCSLCSLCS的轉移式,
LCS(S[1,i],Py)=LCS(S[1,i?1],P)+1LCS(S[1,i],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i],Py)=LCS(S[1,i?1],P)+1
∵LCS(S[1,i],Py)=LCS(S[1,i],P)+1\because LCS(S[1,i],Py)=LCS(S[1,i],P)+1LCS(S[1,i],Py)=LCS(S[1,i],P)+1
∴LCS(S[1,i?1],P)=LCS(S[1,i],P)\therefore LCS(S[1,i-1],P)=LCS(S[1,i],P)LCS(S[1,i?1],P)=LCS(S[1,i],P)
∴LCS(S[1,i],Py)=LCS(S[1,i],P)+1?LCS(S[1,i?1],P)=LCS(S[1,i],P)\therefore LCS(S[1,i],Py)=LCS(S[1,i],P)+1\Rightarrow LCS(S[1,i-1],P)=LCS(S[1,i],P)LCS(S[1,i],Py)=LCS(S[1,i],P)+1?LCS(S[1,i?1],P)=LCS(S[1,i],P)

我們不妨新設一個狀態g(i,j)g(i,j)g(i,j),表示在T[1,j]T[1,j]T[1,j]里找最長的后綴QQQ滿足LCS(S[1,i?1],T[1,j])=LCS(S[1,i],T[1,j])LCS(S[1,i-1],T[1,j])=LCS(S[1,i],T[1,j])LCS(S[1,i?1],T[1,j])=LCS(S[1,i],T[1,j])g(i,j)g(i,j)g(i,j)表示QQQ的起點位置

∴f(i,j)=g(i,j?1)\therefore f(i,j)=g(i,j-1)f(i,j)=g(i,j?1)

S[i]!=yS[i]!=yS[i]!=y
則根據LCSLCSLCS的轉移式,
LCS(S[1,i],Py)=max{LCS(S[1,i?1],Py),LCS(S[1,i],P)}LCS(S[1,i],Py)=max\{LCS(S[1,i-1],Py),LCS(S[1,i],P)\}LCS(S[1,i],Py)=max{LCS(S[1,i?1],Py),LCS(S[1,i],P)}
∵LCS(S[1,i],Py)=LCS(S[1,i],P)+1\because LCS(S[1,i],Py)=LCS(S[1,i],P)+1LCS(S[1,i],Py)=LCS(S[1,i],P)+1
∴LCS(S[1,i?1],Py)=LCS(S[1,i],P)+1\therefore LCS(S[1,i-1],Py)=LCS(S[1,i],P)+1LCS(S[1,i?1],Py)=LCS(S[1,i],P)+1
LCS(S[1,i],P)=LCS(S[1,i?1],P)+1LCS(S[1,i],P)=LCS(S[1,i-1],P)+1LCS(S[1,i],P)=LCS(S[1,i?1],P)+1
LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)+2(舍)LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)+2(舍)LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)+2()
∴LCS(S[1,i],P)=LCS(S[1,i?1],P)\therefore LCS(S[1,i],P)=LCS(S[1,i-1],P)LCS(S[1,i],P)=LCS(S[1,i?1],P)
∴LCS(S[1,i],Py)=LCS(S[1,i],P)+1?{LCS(S[1,i],P)=LCS(S[1,i?1],P)LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)+1\therefore LCS(S[1,i],Py)=LCS(S[1,i],P)+1\Rightarrow \left\{ \begin{aligned} &LCS(S[1,i],P)=LCS(S[1,i-1],P) \\ & LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)+1\\ \end{aligned} \right. LCS(S[1,i],Py)=LCS(S[1,i],P)+1?{?LCS(S[1,i],P)=LCS(S[1,i?1],P)LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)+1?
∴f(i,j)=max{f(i?1,j),g(i,j?1)}\therefore f(i,j)=max\{f(i ?1,j),g(i,j?1)\}f(i,j)=max{f(i?1,j),g(i,j?1)}

再考慮g(i,j)g(i,j)g(i,j)的轉移:
Q=PyQ=PyQ=Py
S[i]=yS[i]=yS[i]=y
則根據LCSLCSLCS的轉移式,
LCS(S[1,i],Py)=LCS(S[1,i?1],P)+1LCS(S[1,i],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i],Py)=LCS(S[1,i?1],P)+1
∵LCS(S[1,i?1],Py)=LCS(S[1,i],Py)\because LCS(S[1,i-1],Py)=LCS(S[1,i],Py)LCS(S[1,i?1],Py)=LCS(S[1,i],Py)
∴LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)+1\therefore LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)+1
∴LCS(S[1,i?1],Py)=LCS(S[1,i],Py)?\therefore LCS(S[1,i-1],Py)=LCS(S[1,i],Py)\RightarrowLCS(S[1,i?1],Py)=LCS(S[1,i],Py)?
LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)+1LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)+1
∴g(i,j)=f(i?1,j)\therefore g(i,j) = f(i?1,j)g(i,j)=f(i?1,j)

S[i]!=yS[i]!=yS[i]!=y
引理
LCS(Ax,By)<=LCS(A,B)+1LCS(Ax,By)<=LCS(A,B)+1LCS(Ax,By)<=LCS(A,B)+1
證明
x=yx=yx=y
LCS(Ax,By)=LCS(A,B)+1LCS(Ax,By)=LCS(A,B)+1LCS(Ax,By)=LCS(A,B)+1,引理顯然成立
x!=yx!=yx!=y
∵{LCS(A,By)<=LCS(A,B)+1LCS(Ax,By)<=LCS(A,B)+1\because \left\{ \begin{aligned} &LCS(A,By)<=LCS(A,B)+1 \\ & LCS(Ax,By)<=LCS(A,B)+1\\ \end{aligned} \right. {?LCS(A,By)<=LCS(A,B)+1LCS(Ax,By)<=LCS(A,B)+1?
∴LCS(Ax,By)=max{LCS(A,By),LCS(Ax,B)}<=LCS(A,B)+1\therefore LCS(Ax,By)=max\{LCS(A,By),LCS(Ax,B)\}<=LCS(A,B)+1LCS(Ax,By)=max{LCS(A,By),LCS(Ax,B)}<=LCS(A,B)+1

根據LCSLCSLCS的轉移式,
LCS(S[1,i],Py)=max{LCS(S[1,i?1],Py),LCS(S[1,i],P)}LCS(S[1,i],Py)=max\{LCS(S[1,i-1],Py),LCS(S[1,i],P)\}LCS(S[1,i],Py)=max{LCS(S[1,i?1],Py),LCS(S[1,i],P)}

LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)
LCS(S[1,i],P)=LCS(S[1,i?1],P)LCS(S[1,i],P)=LCS(S[1,i-1],P)LCS(S[1,i],P)=LCS(S[1,i?1],P)

LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)+1LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)+1
則根據引理,LCS(S[1,i],Py)=LCS(S[1,i?1],P)+1LCS(S[1,i],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i],Py)=LCS(S[1,i?1],P)+1
∴LCS(S[1,i?1],Py)=LCS(S[1,i],Py)必成立\therefore LCS(S[1,i-1],Py)=LCS(S[1,i],Py)必成立LCS(S[1,i?1],Py)=LCS(S[1,i],Py)

∴LCS(S[1,i?1],Py)=LCS(S[1,i],Py)?\therefore LCS(S[1,i-1],Py)=LCS(S[1,i],Py)\RightarrowLCS(S[1,i?1],Py)=LCS(S[1,i],Py)?
LCS(S[1,i],P)=LCS(S[1,i?1],P)或LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)+1LCS(S[1,i],P)=LCS(S[1,i-1],P)或LCS(S[1,i-1],Py)=LCS(S[1,i-1],P)+1LCS(S[1,i],P)=LCS(S[1,i?1],P)LCS(S[1,i?1],Py)=LCS(S[1,i?1],P)+1
∴g(i,j)=min{f(i?1,j),g(i,j?1)}\therefore g(i, j) =min\{f(i?1, j), g(i,j?1)\}g(i,j)=min{f(i?1,j),g(i,j?1)}

#include<iostream> #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; const int N=5005; const ll mod=998244353; int n,m,s[N],t[N]; int f[N][N],g[N][N],c[N]; ll p[N],ans[N]; int main(){scanf("%d%d",&n,&m);p[0]=1;for(int i=1;i<=m;i++) p[i]=p[i-1]*233%mod;for(int i=1;i<=n;i++) scanf("%d",&s[i]);for(int i=1;i<=m;i++) scanf("%d",&t[i]);for(int i=0;i<=m;i++) f[0][i]=i+1;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(s[i]==t[j]){f[i][j]=g[i][j-1];g[i][j]=f[i-1][j];}else{f[i][j]=max(f[i-1][j],g[i][j-1]);g[i][j]=min(f[i-1][j],g[i][j-1]);}} }for(int i=1;i<=m;i++){for(int j=f[n][i];j<=i;j++) c[j]++;for(int j=1;j<=i;j++) ans[j]=(ans[j]+c[j]*p[i-j]%mod)%mod;}for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);return 0; }

總結

以上是生活随笔為你收集整理的[XSY] 宝藏(LCS,DP)的全部內容,希望文章能夠幫你解決所遇到的問題。

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