給定乙個環形的01序列,保證任意相鄰的m個值中有不超過k個1,求滿足要求的方案數對1e9+7取模的值
狀壓dp+矩陣快速冪
由於m的範圍很小,所以我們考慮狀壓dp儲存狀態,而由於n很大,所以我們考慮矩陣快速冪優化轉移
我們定義$f(i,j)$表示前i個數最後m個的狀態為j時的方案數,顯然這個dp的初始是所有合法的$f(m,j)$
考慮這個dp的終點,顯然是$f(n+m,j)$,別忘了這是乙個環形。
那麼我們通過矩陣優化轉移,定義矩陣x[i][j]表示i狀態能否轉移到j狀態,那麼轉移我們只需要將這個矩陣自乘n次即可
關於初始狀態,我們可以通過dfs列舉合法的狀態即可。
最終的答案就是x[i][i]
時間複雜度為$o((2^m)^3log_2n)$
1 #include 2ac codeusing
namespace
std;
3 typedef long
long
ll;4
const
int mod = 1e9 + 7;5
ll n, m, k;
6int maxx, id[7];7
struct
matrix
10 matrix operator *(const matrix &x) const
18} a, b;
19int vis[1000
];20
void make(int s, int
num)
25void dfs(int x, int now, int
s) 30 dfs(x + 1
, now, s);
31if (now < k) dfs(x + 1, now + 1, s | id[x - 1
]);32}33
intmain()
45 ll ans = 0;46
for (register int i = 0; i <= maxx; ++i)
47if (vis[i]) ans = (ans + a.m[i][i]) %mod;
48 printf("
%lld\n
", ans);
49return0;
50 }
狀壓dp 矩陣 洛谷 P1357 花園
簡單來說,這一題就是乙個狀壓dp用矩陣優化 但是這個矩陣也是最最最基礎的矩陣了 floyd矩陣 dp的話,和第乙個題解hi一樣的 f i s 表示第i位時的方案,s為i i m 1的狀態 然後轉移的時候我們列舉i列舉2個s if v j k f i j f i j f i 1 k mo 這裡的v j...
洛谷P1357 花園(狀態壓縮 矩陣快速冪)
小l有一座環形花園,沿花園的順時針方向,他把各個花圃編號為1 n 2 n 10 15 他的環形花園每天都會換乙個新花樣,但他的花園都不外乎乙個規則,任意相鄰m 2 m 5,m n 個花圃中有不超過k 1 k例如,n 10,m 5,k 3。則 ccpcppppcc 是一種不符合規則的花圃 ccpppp...
洛谷 1357 花園
的運算優先順序低於 貌似對矩陣理解更深刻了!2 m 5,相鄰的m個花圃可能有2 m種狀態 用0 2 m 1來表示 要求有不超過k個c形花圃,對應其二進位制形式中的0不超過k個。標記出0 2 m 1中滿足條件的狀態x,對於每個狀態x,前m個花圃會出現1次 f i,x 表示前i個花圃中,最後m個花圃的狀...