牛客練習賽35B 背單詞 O n 轉移

2021-10-12 18:08:45 字數 1484 閱讀 7669

傳送門

定義f[i]

[j][

0/1]

f[i][j][0/1]

f[i][j

][0/

1]表示長度i

ii且目前連續j

jj個了,當前連續的是母音/子音

這樣就是傻瓜式轉移,轉移的時候注意一下不要陣列越界(我因為這個調了一小時…)

其實這麼轉移是非常浪費的

這麼轉移複雜度o(n

m)

o(nm)

o(nm

),其中m

mm表示限制連續長度

假如n

nn和m

mm大一些就不行了…

考慮容斥

定義f [i

][0/

1]

f[i][0/1]

f[i][0

/1]為截至到第i

ii個字母,當前是母音/子音

如果沒有任何限制,那麼f[i

][0]

=sum

[i−1

]∗

5f[i][0]=sum[i-1]*5

f[i][0

]=su

m[i−

1]∗5

那麼f[i]

[1]=

sum[

i−1]

∗21

f[i][1]=sum[i-1]*21

f[i][1

]=su

m[i−

1]∗2

1 其中s um

[i

]sum[i]

sum[i]

表示長度為i

ii的總方案數字

有限制,想一下當前加入乙個母音後有哪些方案數不合法

在i

ii位置加乙個母音,那麼[i−

a,i−

1]

[i-a,i-1]

[i−a,i

−1]都為母音的話會造成衝突

此時不合法的方案數是f[i

−a−1

][1]

f[i-a-1][1]

f[i−a−

1][1

] 這樣一直容斥去計算即可

#include

using

namespace std;

#define int long long

const

int mod =

1e9+7;

int t,n,a,b,f[

5009][

2],cnt[

5009];

intquick

(int x,

int n)

signed

main()

printf

("%lld\n"

,(ans%mod+mod)

%mod);}

}

牛客練習賽35 B 簡單dp,ORZ

思路 想明白了發現真的簡單dp。我還是太菜了 如下 果不其然。簡單dp.是我菜,不是題目難 做這題首先我沒想到dp 哭暈 看了題解半天。一臉懵逼 既然dp解那麼先考慮最優解的結構特徵 先想只用一維表示,dp i 在i這個位置上得到的最多的方案數 上面是不行的,因為dp i 沒有記錄i位置上是什麼元素...

牛客練習賽4 B

思維題,把 i2 j2 ai2 aj2 絕對值符號去掉後,我們設i2 j2 ai2 aj2 j2 i2 aj2 ai2 j2 aj2 i2 ai2 或者 i2 j2 ai2 aj2 j2 i2 aj2 ai2 ai2 i2 aj2 j2 原式化簡後只有這兩種形式,那麼我們可以設定兩個陣列a n b ...

牛客練習賽69 B

題意 給定n nn個數,乙個x xx表示可以劃分成最多x xx個串,乙個y yy表示在乙個串中最多選擇y yy個數。最後求 i 1x j 1yv al i j sum x sum yval i,j i 1x j 1 y va l i,j v al i,j val i,j val i,j 為 將n n...