傳送門
定義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...