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