hdu 2604 DP 矩陣二分

2021-06-11 01:17:20 字數 861 閱讀 4016

實際上就是這樣乙個問題,乙個序列僅由1和0組成,問n位不帶101和111子串行有多少個,結果模m

話說這是集訓的一道題,當時完全沒思路,今天做了一下,還是沒有做出來,不過好歹還會用最裸的記憶化搜尋。。。但肯定超時(話說集訓那時真的弱爆了。。超弱的1b)

看了下解題報告,發現1維dp既能搞定,再用矩陣二分。。其實這個dp怎麼推出來的呢?就是分類討論出來的。。(哎,其實真的很簡單,但偏偏想亂了,這方面題果斷刷的太少)。。設f(n)為n位滿足題意的數列數。。。當第1位為0時,f(n)=f(n-1),若第二位為1,那麼肯定第三位必須要為0,這個時候在看第二位,若第二位為0時,f(n)=f(n-3),若第二位為1時,那嗎只有1100...滿足條件,而第5位無論是神馬也滿足,f(n)=f(n-4)...所以f(n)=f(n-1)+f(n-3)+f(n-4)...矩陣快速冪即可。。(注意雖然是3項,但矩陣一定是4項,剛開始因為寫成3項就wa了。。。)

#include #define n 25

#define m 4

#define cl(a) memset(a,0,sizeof(a))

#define ss(a) scanf("%d",&a)

using namespace std;

int n,m,f[5],u[n][5][5],t[5];

const int a[5]=;

const int b[5]=;

void init()

void mi(int x)

return;

}void mul(int x)

void bin(int n1)

}

int main()

init();

for (i=1;i

矩陣二分快速冪優化dp

思路就是先寫出dp的狀態轉移方程,然後再把它轉成形如 f i f i 1 a f i 1 f i 2 的形式,尤其是看到要求的i值取值範圍很大時,明白不能普通dp了不然容易超時 然後由 矩陣二分快速冪 來快速直接求得f i 而不用像普通dp一樣乙個乙個向上做。2018 3 31 又默碼了一遍,發現有...

hdu 3586 樹形dp 二分

題意 給n個節點的樹,要求使葉子節點與根斷開,割掉的邊的權值和不超過m。求這些被割邊的權值最大中的最小。dp u min dp v w w 為 u 到 v 的權值。如果w 大於二分的 mid dp u dp v 二分列舉邊權。include include include includeusing ...

hdu 1025 dp 二分 模板

題意 在一條河的兩邊各有n個位置,在這些位置之間建橋,要求所有橋之間不能交叉。現在告訴你所有可以建橋的位置,例如2,4,就是說河左邊的位置2可以與河右邊的位置4之間建橋,現在要求滿足要求的情況下最多可以建橋的個數。分析 想了好久發現是乙個最長上公升子串行問題,當時n比較大,所以一般的dp演算法不能解...