狀壓矩陣優化DP 花園

2021-10-23 19:50:43 字數 1850 閱讀 3349

我就是個辣雞,狀壓都沒看出來,只會打dfs

對於m<=5,肯定考慮狀壓

令c為1,p為0

那麼二進位制狀態最多也就11111,十進位制的31,陣列不大,可以過80

令dp[i][s]表示序列長度為i,最後m位狀態為s的方案數,肯定可以通過dp[i][k]轉移過來

至於k,s能否進行轉移,我們先進行dfs預處理出所有合法情況,且兩個狀態能否轉移。用vis陣列標記。

之後列舉起點即前m個的情況,進行dp即可。

需要注意的是這個序列是環形的,因而我們需要多搞乙個m,那麼最後我們回到了初始的狀態

樸素dp**如下

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int mod =

1e9+7;

long

long n,dp[

100005][

35],ans;

int m,k,a[6]

,sum[10]

;bool vis[65]

[65],ok[65]

;void

check()

void

work

(int x)

void

dfs(

int step)

a[step]=1

;dfs

(step +1)

; a[step]=0

;dfs

(step +1)

;}intmain()

但是n太大了,我們搞不動,但我們會發現對於每乙個狀態,更新它的狀態其實是一定的,且每乙個狀態都更新了n次。因而我們將vis陣列自乘n次,加上能回到初始狀態的方案數即可。是乙個矩陣優化dp的做法

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int mod =

1e9+7;

struct matrix

matrix operator*(

const matrix &rhs)

const

}vis;

long

long n,ans;

int m,k,a[6]

,sum[10]

;bool ok[65]

;void

check()

/*void work(int x)*/

void

dfs(

int step)

a[step]=1

;dfs

(step +1)

; a[step]=0

;dfs

(step +1)

;}matrix qkpow

(matrix x,

long

long y)

return ans;

}int

main()

狀壓矩陣優化DP 花園

我就是個辣雞,狀壓都沒看出來,只會打dfs 對於m 5,肯定考慮狀壓 令c為1,p為0 那麼二進位制狀態最多也就11111,十進位制的31,陣列不大,可以過80 令dp i s 表示序列長度為i,最後m位狀態為s的方案數,肯定可以通過dp i k 轉移過來 至於k,s能否進行轉移,我們先進行dfs預...

狀壓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...

花園 洛谷 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 是一種不符合規則的花圃 ...