Codeforces Round #635 (Div. 1) C. Kaavi and Magic Spell 区间dp
傳送門
文章目錄
- 題意:
- 思路:
題意:
給你兩個串s,ts,ts,t,每次都可以從sss的開頭拿一個字符放到AAA串的開頭或結尾,問最終有多少種方案使得ttt是AAA的前綴,注意sss不必全部拿完。
m,n≤3000m,n\le3000m,n≤3000
思路:
分析一下題目的性質,每次都給一個串從前面或從后面加一個字符,相當于從兩邊擴展長度,可以聯想到區間dpdpdp。
設f[l][r]f[l][r]f[l][r]表示用sss的前r?l+1r-l+1r?l+1個字符拼成ttt的[l,r][l,r][l,r]的方案數,有一個很明顯的轉移方程:f[l][r]+=f[l+1][r](s[len]==t[l])f[l][r]+=f[l+1][r](s[len]==t[l])f[l][r]+=f[l+1][r](s[len]==t[l])f[l][r]+=f[l][r?1](s[len]==t[r])f[l][r]+=f[l][r-1](s[len]==t[r])f[l][r]+=f[l][r?1](s[len]==t[r])
直接這么寫是不對的,因為我們發現s,ts,ts,t的長度不相等,也就是說如果len>mlen>mlen>m的話,有一部分放的時候是沒有要求的,具體來說:
(1)(1)(1)當l>ml>ml>m的時候,它可以放在lll的位置,也可以放在rrr的位置。
(2)(2)(2)當r>mr>mr>m的時候,它可以放在rrr的位置。
所以轉移的時候判斷一下這兩個條件就好啦。
初始的時候f[i][i]=2?(i>m∣∣s[1]==t[i])f[i][i]=2*(i>m||s[1]==t[i])f[i][i]=2?(i>m∣∣s[1]==t[i])。
最終答案為∑i=mnf[1][i]\sum_{i=m}^nf[1][i]∑i=mn?f[1][i]。
總結
以上是生活随笔為你收集整理的Codeforces Round #635 (Div. 1) C. Kaavi and Magic Spell 区间dp的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Deltix Round, Spring
- 下一篇: 吕一的个人资料 吕一人物简介