1079 SCOI2008 著色方案

2022-05-12 09:45:08 字數 1326 閱讀 3957

有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

記憶化搜尋一下吧。。。也算是dp吧。。。因為每種顏色最多5個。。所以表示有a個1個的,b個2個的,c個3個的,d個4個的,e個5個的,前乙個是f個的,的方案總數。。。

然後轉移就比較顯然了。。。

1 #include2 #include3 #include4 #include5 #include6 #include7 #include

8 #include9 #include10 #include11 #include

12#define inf 1000000000

13#define maxn 16

14#define maxm 6

15#define eps 1e-10

16#define ll long long

17#define mod 1000000007

18#define for0(i,n) for(int i=0;i<=(n);i++)

19#define for1(i,n) for(int i=1;i<=(n);i++)

20#define for2(i,x,y) for(int i=(x);i<=(y);i++)

21#define for3(i,x,y) for(int i=(x);i>=(y);i--)

22#define for4(i,x) for(int i=head[x],y=e[i].go;i;i=e[i].next,y=e[i].go)

23using

namespace

std;

24int

read()

27while(ch>='

0'&&ch<='9')

28return x*f;29}

30ll f[maxn][maxn][maxn][maxn][maxn][maxn];

31int

k,w[maxn],t[maxn];

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

f)42

intmain()

view code

1079 SCOI2008 著色方案

time limit 10 sec memory limit 162 mb submit 1617 solved 985 submit status discuss 有n個木塊排成一行,從左到右依次編號為1 n。你有k種顏色的油漆,其中第i種顏色的油漆足夠塗ci個木塊。所有油漆剛好足夠塗滿所有木塊,...

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,...