題目傳送門
題目描述:
有兩個僅包含小寫英文本母的字串 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]
,0s1[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 的時...