牛客小白月賽3 B 躲藏 動態規劃

2021-08-19 23:02:26 字數 1319 閱讀 1251

第一眼看以為是kmp,然後仔細一看是子串行,再看資料範圍,暴力的話肯定會超時,所以這道題需要用動態規劃來寫,令 f[i][j],(j = 1,2,3,4) 表示前 i 個字元中,匹配了字串」cwbc」 的前多少位,那麼有轉移方程:

f[i][1] = (f[i−1][1] + (s[i] ==′ c′)) % mod

f[i][2] = (f[i−1][2] + (s[i] ==′ w′)∗f[i−1][1]) % mod

f[i][3] = (f[i−1][3] + (s[i] ==′ b′)∗f[i−1][2]) % mod

f[i][4] = (f[i−1][4] + (s[i] ==′ c′)∗f[i−1][3]) % mod

但是陣列的開小大概需要 35mb 左右,會超過記憶體限制,所以還需要優化一下。

容易發現,每乙個字元的狀態都只從它前乙個字元的狀態轉移過來,顯然我們可以考慮使用滾動陣列來優化空間開銷。我們考慮去掉第一維的狀態,只保留第二維的狀態。那麼轉移方程就變為:

f[1] = (f[1] + (s[i] ==′ c′)) % mod

f[2] = (f[2] + (s[i] ==′ w′)∗f[1]) % mod

f[3] = (f[3] + (s[i] ==′ b′)∗f[2]) % mod

f[4] = (f[4] + (s[i] ==′ c′)∗f[3]) % mod

同乙個位置有且僅有乙個字元,不難發現轉移方程間是不會相互影響的。因此,省去第一維的狀態

是正確的。

ac**:

#include #include #include #include #define ll long long

#define mod 2000120420010122

using namespace std;

string str;

ll dp[5];

int main()

cout<} return 0;

}

牛客小白月賽3 B 躲藏

傳送門 題目描述 xhrlyb和她的小夥伴cwbc在玩捉迷藏遊戲。cwbc藏在多個不區分大小寫的字串中。好奇的xhrlyb想知道,在每個字串中cwbc作為子串行分別出現了多少次。由於cwbc可能出現的次數過多,你只需要輸出每個答案對2000120420010122取模後的結果。聰明的你在仔細閱讀題目...

牛客小白月賽3 B 躲藏

題目鏈結 xhrlyb和她的小夥伴cwbc在玩捉迷藏遊戲。cwbc藏在多個不區分大小寫的字串中。好奇的xhrlyb想知道,在每個字串中cwbc作為子串行分別出現了多少次。由於cwbc可能出現的次數過多,你只需要輸出每個答案對 2000120420010122 2000120420010122 200...

牛客網小白月賽3 B 躲藏 簡單DP

b 躲藏 xhrlyb和她的小夥伴cwbc在玩捉迷藏遊戲。cwbc藏在多個不區分大小寫的字串中。好奇的xhrlyb想知道,在每個字串中cwbc作為子串行分別出現了多少次。由於cwbc可能出現的次數過多,你只需要輸出每個答案對2000120420010122取模後的結果。聰明的你在仔細閱讀題目後,一定...