我就是個辣雞,狀壓都沒看出來,只會打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 是一種不符合規則的花圃 ...