Link
Solution 1
脑洞超大 首先考虑最最暴力的做法,把每种颜色的剩余个数压起来的状压DP肯定是可以做的, 表示序列中的颜色的个数的状态为,第一个位置颜色是的方案数目,转移就枚举就好了 只是状态有个(233)。(PS:排队题?) 然后考虑做了什么无用功:个数相同的颜色是本质相同的,一种方案的颜色置换一下就是另一个方案。因此,要开一个相当大的脑洞: 分别记录剩余个可用块的颜色数,表示上一位放的颜色的剩余的个数。 DFS,枚举当前要放的色块的可用个数,然后相应加减,进入下一层DFS,累计返回的答案。 具体做法是, 现在要放的一种剩下个可用块的颜色,那么计算。 假如说,那么答案累加,否则累加。 仔细想想是非常妙的,把本质相同的状态一起计算,通过乘法原理累计答案。
Code 1
1 |
|
Solution 2
发现有大神给出了更科学的清真做法,其实和那个排队神似
表示构造了含有所有前种颜色的色块的序列,有对同色相邻
那么答案就是
考虑转移
现在有个第种颜色的色块,要把它们分到已经有的长度为的序列中。
大体可以用这些色块搞这三件事:
1. 确立社会主义市场经济
- 放到一起,组成新的相邻同色对
- 塞到已经有的相邻同色对中,无情地拆散
- 老老实实地分到一些相邻不同色的对的中间
然后这个过程看起来是很复杂的,其实经过一番抽象可以看成这样的东西: 把个色块,分成个组,把这些组的前个塞到已有的相邻同色对中间,后个塞到相邻的不同色对中间。 那么这样的话,新的序列就会多出对相邻同色对 那么这样构造的方案数目呢? 把个分组,插板法, 塞前组,有种方法 剩下的,有种方法
Code 2
1 |
|
不得不说,
一道题的两种做法都这么巧妙优美凝练,这真**是个好题!