[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(GGG為PPP的后綴)
即SSS中至少有一個yyy是PPP匹配不到的,
那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)+1。f(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)+1∵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-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)+1∵LCS(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)+1∴LCS(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)+1∴LCS(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)\Rightarrow∴LCS(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)+1∴LCS(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)\Rightarrow∴LCS(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)}
總結
以上是生活随笔為你收集整理的[XSY] 宝藏(LCS,DP)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一大波好莱坞电影特效前后对比照好莱坞大片
- 下一篇: [XSY] 简单的数论题(数学、构造)