簡單來說,這一題就是乙個狀壓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][k]表示狀態j是否可以轉移到狀態k;
這個陣列是一開始直接暴力預處理的;
那麼我的70分的**(無滾存)
#include
#define ll long long
using
namespace
std;
bool v[64][64],ok[64];
int bb[10],b[10];
ll f[100010][64];
ll n,m,k,w,ans,mo=1e9+7;
void check()
void dfs(int x)
b[x]=1;dfs(x+1);
b[x]=0;dfs(x+1);
}void work(int x)
int main()
然後矩陣快速冪直接套上去就好了;
就是把那個v直接自乘n次,然後算答案;
#include
#define ll long long
using
namespace
std;
struct jv
}v,a;
bool ok[64];
int bb[10],b[10];
ll n,m,k,w,ans,mo=1e9+7;
void check()
void dfs(int x)
b[x]=1;dfs(x+1);
b[x]=0;dfs(x+1);
}jv cheng(jv a,jv b)
jv ksm(jv x,ll y)
int main()
洛谷P1357 花園
給定乙個環形的01序列,保證任意相鄰的m個值中有不超過k個1,求滿足要求的方案數對1e9 7取模的值 狀壓dp 矩陣快速冪 由於m的範圍很小,所以我們考慮狀壓dp儲存狀態,而由於n很大,所以我們考慮矩陣快速冪優化轉移 我們定義 f i,j 表示前i個數最後m個的狀態為j時的方案數,顯然這個dp的初始...
花園 洛谷 1357 狀壓DP 矩陣虧快速冪
題目描述 小l有一座環形花園,沿花園的順時針方向,他把各個花圃編號為1 n 2 n 10 15 他的環形花園每天都會換乙個新花樣,但他的花園都不外乎乙個規則,任意相鄰m 2 m 5,m n 個花圃中有不超過k 1 k 例如,n 10,m 5,k 3。則 ccpcppppcc 是一種不符合規則的花圃 ...
P1357 花園 矩陣快速冪 DP
題意 乙個只含字母c和p的環形串 求長度為n且每m個連續字元不含有超過k個c的方案數 m 5 n 1e15 題解 用乙個m位二進位制表示狀態 轉移很好想 但是這個題是用矩陣快速冪加速dp的 因為每一位的轉移都是一樣的 用乙個矩陣表示狀態i能否轉移到狀態j 然後跑一遍 統計答案特別講究 因為是乙個環 ...