bzoj1079 SCOI2008 著色方案

2021-08-19 15:31:46 字數 1228 閱讀 7936

time limit: 10 sec  

memory limit: 162 mb

submit: 2533  

solved: 1542 [

submit][

status][

discuss]

有n個木塊排成一行,從左到右依次編號為1~n。你有k種顏色的油漆,其中第i種顏色的油漆足夠塗ci個木塊。

所有油漆剛好足夠塗滿所有木塊,即c1+c2+...+ck=n。相鄰兩個木塊塗相同色顯得很難看,所以你希望統計任意兩

個相鄰木塊顏色不同的著色方案。

第一行為乙個正整數k,第二行包含k個整數c1, c2, ... , ck。

輸出乙個整數,即方案總數模1,000,000,007的結果。

31 2 3

10100%的資料滿足:1 <= k <= 15, 1 <= ci <= 5 [

submit][

status][

discuss]

題解:這種題我自己想還是算了吧。膜拜網上神奇的思路。

我們記每個顏色拿了多少是5^15的,於是轉換一下思路,我們記錄使用1,2,3,4,5次的顏色有多少種,因為實際上不同種類的顏色之間是等價的,所以只需要記錄出現的次數,因為考慮兩種油漆如果當前都能塗x次,那麼他們本質是一樣的

所以我們用w[a][b][c][d][e][last]記錄還剩下1,2,3,4,5次使用次數的顏色的數量為a,b,c,d,e,上一次我們那的是使用次數剩餘為last的顏色,那麼這次在剩餘last-1次的顏色中,我們只能少拿一次,因為不能拿相同的,這樣轉移就很容易的表示出來了。//剛開始把,狀態的表示理解反了,嗚嗚嗚

那麼很容易推出轉移式子,注意對於相鄰位置不能是相同的顏色的設定,我們規定這次拿的等價顏色不能和上次的等價顏色相同,於是直接在係數裡面判斷一下減去即可

好好理解下**應該問題不大的(我也是看了一會才理解dp的意思的)。

**:

#includeusing namespace std;

int n,i,t,a[10],g[16][16][16][16][16][6];

long long f[16][16][16][16][16][6];

long long dfs(int a,int b,int c,int d,int e,int now)

int main()

printf("%lld",dfs(a[1],a[2],a[3],a[4],a[5],0));

}

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。輸...