BZOJ1079 著色方案

2022-07-16 19:12:10 字數 873 閱讀 8539

吼題啊!

自己做,不會做,看完題解分析,不會寫**,看完**自己寫,交上去報錯,複製題解**交上去,通過。

類似於中國象棋,這道題也涉及合併本質相同的狀態。最簡單的思路是,設dp[a1][a2]...[ak][last]表示第幾種顏色還剩幾次可以使用,上一次用的是什麼顏色的方案數。顯然會炸,實際上,我們只關心還可以用幾次的顏色有幾種,並不關心具體是哪種顏色,剛好,每種顏色可以使用的次數並不多。設dp[a][b][c][d][e][l]表示還可用1次的顏色有a種,2次的有b種,...,上一次用的是剩餘l次的顏色,注意是上一次用之前剩l次,對於當前是剩l-1次的某種顏色。然後討論接下來選擇剩幾次的顏色即可,注意剩l+1次的顏色會少一種選擇。

1 #include 2 #include 3

4 typedef long

long

ll;5

6const

int maxk = 16, maxc = 6, mod = 1e9 + 7;7

8int

rest[maxc];

9ll dp[maxk][maxk][maxk][maxk][maxk][maxc];

1011 ll dfs(int a, int b, int c, int d, int e, int

l) 23

24int

main()

31 memset(dp, -1, sizeof

(dp));

32 printf("

%lld

", dfs(rest[1], rest[2], rest[3], rest[4], rest[5], 0

));33

return0;

34 }

ac**

BZOJ 1079 SCOI2008 著色方案

題目 分析 一看就覺得是dp或者直接排列組合公式或者容斥?我就只想到dp的,我們用dp i j 表示前i種顏色,排列出有j對相鄰一樣顏色的方案數。當出現乙個新的顏色時,我們把這個顏色插板法插進去,我們要列舉插入的方式,可能插到相鄰顏色一樣的中間,或者不是,然後進行狀態轉移.具體看 include i...

BZOJ1079 SCOI2008著色方案 DP

只能想到 5 15 的方法。我們要利用起 ci比較小這個性質,f a b c d e last 表示有a 種顏色用了1個,b種顏色用了2個 上一次染色用的是剩餘 last 個的顏色,轉移就是f a,b,c,d,e,last a last 2 f a 1,b,c,d,e b last 3 f a 1,...

bzoj1079 SCOI2008 著色方案

有n個木塊排成一行,從左到右依次編號為1 n。你有k種顏色的油漆,其中第i種顏色的油漆足夠塗ci個木塊。所有油漆剛好足夠塗滿所有木塊,即c1 c2 ck n。相鄰兩個木塊塗相同色顯得很難看,所以你希望統計任意兩個相鄰木塊顏色不同的著色方案。第一行為乙個正整數k,第二行包含k個整數c1,c2,ck。輸...