cache式DP(记忆化dfs)

【bzoj1079】[SCOI2008]着色方案

2014年3月8日 170 0

Description

有n个木块排成一行,从左到右依次编号为1~n。你有k种颜色的油漆,其中第i种颜色的油漆足够涂ci个木块。所有油漆刚好足够涂满所有木块,即c1+c2+...+ck=n。相邻两个木块涂相同色显得很难看,所以你希望统计任意两个相邻木块颜色不同的着色方案。

Input

第一行为一个正整数k,第二行包含k个整数c1, c2, ... , ck。

Output

输出一个整数,即方案总数模1,000,000,007的结果。

Sample Input

3
1 2 3

Sample Output

10

HINT

 

【样例2】 Input 5 2 2 2 2 2 Output 39480 【样例3】 Input 10 1 1 2 2 3 3 4 4 5 5 Output 85937576 数据规模】 50%的数据满足:1 <= k <= 5, 1 <= ci <= 3 100%的数据满足:1 <= k <= 15, 1 <= ci <= 5

 

题解

直接集合dp肯定是不行的..考虑两种油漆如果当前都能涂x次,那么他们本质是一样的。

 

所以用F[a][b][c][d][e][l]表示当前有能涂1次的油漆a个,能涂2次的b个....前一个颜色为l,再搞下转移就行了。

 

记忆化实现常数会小一些

你可能感兴趣的:(cache式DP(记忆化dfs))