題解 P2679 子串

2021-10-01 11:45:03 字數 2661 閱讀 2890

傳送門

對於這道題, 有好多大佬發了題解, 狀態轉移方程也都一樣, 但是那些大佬們都是只給個狀態轉移方程, 以至於我這個蒟蒻很難搞懂什麼意思, 所以發篇題解說下自己的理解

$f[i][j][k] = 0 \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad \qquad (a_\ne b_) $

f [i

][j]

[k]=

f[i−

1][j

−1][

k]+s

um[i

−1][

j−1]

[k−1

](ai

=bj)

f[i][j][k] = f[i-1][j-1][k]+sum[i-1][j-1][k-1] \qquad (a_= b_)

f[i][j

][k]

=f[i

−1][

j−1]

[k]+

sum[

i−1]

[j−1

][k−

1](a

i​=b

j​)

這裡用到了滾動陣列,就不過多說明了, 就只簡單說一說狀態轉移方程的含義 :

對於f [i

][j]

[k

]f[i][j][k]

f[i][j

][k]

的定義意思是a

aa串選到aia_

ai​(aia_

ai​被選), b

bb串目前選到bjb_

bj​(bjb_

bj​之前的和bjb_

bj​都被選)的時候分成k

kk段選取共有多少種選法

另外再開乙個陣列記錄字首和, sum

[i][

j][k

]sum[i][j][k]

sum[i]

[j][

k]意思是a

aa串選到aia_

ai​(aia_

ai​與之前的怎麼選都行), b

bb串目前選到bjb_

bj​(bjb_

bj​之前的和bjb_

bj​都被選)的時候分成k

kk段選取所有選取方案的和

s um

[i][

j][k

]=su

m[i−

1][j

][k]

+f[i

][j]

[k

]sum[i][j][k] = sum[i - 1][j][k] + f[i][j][k]

sum[i]

[j][

k]=s

um[i

−1][

j][k

]+f[

i][j

][k]

對於sum陣列的計算不必多說, 但對於f的計算我是想了好久才想明白

若$a_\ne b_ \ f[i][j][k] = 0 ,這個

很容易理

解,因為

若, 這個很容易理解, 因為若

,這個很容易

理解,因

為若a_\ne b_的話,

那麼

的話, 那麼

的話,那

麼a_$選的話是不可能有方案的

若$a_= b_ \ f[i][j][k] = f[i-1][j-1][k]+sum[i-1][j-1][k-1] $, 可能我比較笨吧, 想了好久 :

可以把aib

ja_ \ b_

ai​bj​

與a i−

1bj−

1a_ \ b_

ai−1​b

j−1​

看做乙個整體, 這樣的話,也就只有一種方案, 就是f[i

−1][

j−1]

[k

]f[i-1][j-1][k]

f[i−1]

[j−1

][k]

, 因為sum定義是aia_

ai​可能選或不選的方案和, 但aia_

ai​必選;

可以把aib

ja_ \ b_

ai​bj​

看做乙個單獨的部分, 這樣的話, 方案就會多上sum

[i−1

][j−

1][k

−1

]sum[i-1][j-1][k-1]

sum[i−

1][j

−1][

k−1]

, 因為看做單獨的部分的話, 那麼就相當於$a_ $ (ai−

1a_

ai−1

​選或不選) bj−

1\ b_

bj−1

​每乙個可行方案後面加上乙個匹配的aia_

ai​ $ \ b_,所以

此時

, 所以此時

,所以此

時a_ \ b_(

((a_選或不

選)每一

個可行方

案對

於選或不選)每乙個可行方案對於

選或不選)每

乙個可行

方案對於

a_ \ b_$匹配這種情況都是可行的

這就是本人對於這個狀態轉移方程的理解, **其他大佬們都發了, 本人不再贅述

洛谷 P2679子串

題目背景 無 題目描述 有兩個僅包含小寫英文本母的字串 a 和 b。現在要從字串 a 中取出 k 個互不重疊的非空子串,然後把這 k 個子串按照其在字串 a 中出現的順序依次連線起來得到一 個新的字串,請問有多少種方案可以使得這個新串與字串 b 相等?注意 子串取出 的位置不同也認為是不同的方案。輸...

洛谷 P2679 子串

f i j p 0 1 表示b前j個字元由a的前i個字元分成p段,且a i 選或不選的方案數.1 當前a i 1 可以不選 f i 1 j 1 p 1 0 2 當前a i 與a i 1 在同一段上 f i 1 j 1 p 1 3 當前a i 與a i 1 不在同一段上 f i 1 j 1 p 1 1...

洛谷P2679 NOIP2015 子串

無 有兩個僅包含小寫英文本母的字串 a 和 b。現在要從字串 a 中取出 k 個互不重疊的非空子串,然後把這 k 個子串按照其在字串 a 中出現的順序依次連線起來得到一 個新的字串,請問有多少種方案可以使得這個新串與字串 b 相等?注意 子串取出 的位置不同也認為是不同的方案。輸入格式 輸入檔名為 ...