題解 海亮集訓 dp 子串

2021-09-10 06:27:54 字數 2514 閱讀 3207

題目傳送門

題目描述:

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

【輸入格式】

輸入檔名為 substring.in。

第一行是三個正整數 nn,mm,kk,分別表示字串 aa 的長度,字串 bb 的長度,以及【問題描述】中所提到的 kk,每兩個整數之間用乙個空格隔開。

第二行包含乙個長度為 nn 的字串,表示字串 aa。

第三行包含乙個長度為 mm 的字串,表示字串 bb。

【輸出格式】

輸出檔名為 substring.out。

輸出共一行,包含乙個整數,表示所求方案數。由於答案可能很大,所以這裡要求輸出答案對 1,000,000,007 取模的結果。

【樣例 1】

6 3 1

aabaab

aab【樣例 2】

6 3 2

aabaab

aab【樣例 3】

6 3 3

aabaab

aab樣例解釋如下:

分析:大致看一眼題目跟最長公共序列差不多,只不過題目因為提到了子串行分的段數,所以我們只需要多加一維k,設dp1[i][j][k]表示a串的前i 個字元分成了k個不重疊的子串連線起來後形成了b串的前j個字元。但是我們仔細一想發現不好轉移,就可以再加乙個陣列在第乙個陣列dp2[i][j][k]的基礎上表示最後乙個字元是第i個字元,我們不難得到以下方程:

d p2

[i][

j][k

]=dp1[i-1][j-1][k-1]+dp2[i-1][j-1][k], & \text \\[2ex] 0 & \text \\[2ex] \end

dp2[i]

[j][

k]=⎩

⎪⎨⎪⎧

​dp1

[i−1

][j−

1][k

−1]+

dp2[

i−1]

[j−1

][k]

,0​s1[i]==s2[j]

s1[i]!=s2[j]​

其中第乙個是說明以i結尾的dp2[i][j][k]可以由當前的s1[i]新開乙個段以及不新開一段的個數,第二個是說不相等,那麼就沒有方案

dp1可以這樣轉移:

d p1

[i][

j][k

]=dp

1[i−

1][j

][k]

+dp2

[i][

j][k

];dp1[i][j][k]=dp1[i-1][j][k]+dp2[i][j][k];

dp1[i]

[j][

k]=d

p1[i

−1][

j][k

]+dp

2[i]

[j][

k];又因為這個題會卡空間,所以最後只要用滾動陣列搞一搞就行。

那麼具體**如下:

#include

using

namespace std;

#define p 1000000007

int len1,len2,k;

char s1[

100001

],s2[

100001];

int dp1[2]

[2001][

2001];

int dp2[2]

[2001][

2001];

intmain()

for(

int i=

1;i<=len2;i++

)// for (int i=1;i<=len1;i++) cout/ cout/ for (int i=1;i<=len2;i++) cout/ cout

[0][

0]=dp1[1]

[0][

0]=1

;for

(int i=

1;i<=len1;i++

)for

(int j=

1;j<=len2;j++

)for

(int p=

1;p<=k;p++

)// for (int i=1;i<=len1;i++)

printf

("%d"

,dp1[len1&1]

[len2]

[k])

;fclose

(stdin);

fclose

(stdout);

return0;

}

題解 海亮集訓 倍增 放積木

alice 有 n 塊積木,放置第 i 塊積木會佔據區間 li,ri alice 每次會騰出乙個區間放積木,她希望放的積木盡可能多,對每個詢問區間,你需 要回答 alice 最多可放置的積木數量。注意 積木與積木的放置區間不可重疊,且任意選定的積木放置區間不能超出詢問區間。我們想整解 線段覆蓋,我們...

海亮集訓 題解 線段樹 農場分配

armer john最近新建立了乙個農場,並且正在接受奶牛的畜欄分配請求,有些 畜欄會看到農場美妙的風景。農場由n 1 n 100,000 個畜欄組成,編號為1 n,畜欄i可以最多容納c i只奶牛 1 c i 100,000 奶牛i希望得到連續的一段畜欄,表示為一段區間 a i,b i 這樣的話奶牛...

2019 7 15海亮暑假集訓Day10考試總結

t1,我在做的時候竟然沒想到統計方案,這真的有點.70分啊 這一道題首先可以發現,最長上公升子串行和次長上公升子串行的差別就是 如果最長上公升子串行有1個,那麼次長上公升子串行的長度則為最長上公升子串行 1,否則就是最長上公升子串行,那麼我們就可以統計最長上公升子串行和其方案數就可在o n 2 的時...