(〇)题目描述
有一个\(N\times N\)的单元格,在上面放置\(R\)个红色立方体,\(G\)个绿色立方体,\(B\)个蓝色立方体。要求从南向北看只能看见一种颜色的立方体(如图),求有多少种放法。
(一)解题思路
这道题是一道计数类的问题,第一感觉应该就是\(DP\)了。
下面来分析一下\(DP\)是否可行。
首先,要确定\(DP\)的阶段。因为题目要求从南向北看要全是单一的颜色,那么我们可以将其分为三大类:
- 看到的都是红色
- 看到的都是绿色
- 看到的都是蓝色
不难发现,上述三类的做法其实都是一样的,那么我们只需要考虑一类的做法即可。
就拿第一类来考虑。
不难发现,单元格每一行其实都是独立的。也就是说,只需要保证每一行从南向北看都是红色就可以了。既然如此,\(DP\)的阶段也就确定了:以每行为阶段。
再考虑状态转移方程:
设\(f(i,R,G,B)\)表示前\(i\)行放\(R\)个红色,\(G\)个绿色,\(B\)个蓝色的方案数。
再不妨预处理一个\(g(R,G,B)\)数组,表示在一行内,放\(R\)个红色,\(G\)个绿色,\(B\)个蓝色的方案数。
不难想到状态转移方程:
\[ f(i,R,G,B)=\sum f(i-1,R-R',G-G',B-B')\times g(R',G',B') \]
解释一下\(R'\),\(G'\),\(B'\):
其实就是在枚举第\(i\)行放\(R'\)个红色,\(G'\)个绿色,\(B'\)个蓝色
接下来问题就转换为了:如何求\(g(R,G,B)\)
显然,\(g(R,G,B)\) 是无法直接计算出来的,我们还需要一个\(DP\)。
因为\(g(R,G,B)\)表示的是一行内放\(R\)个红色,\(G\)个绿色,\(B\)个蓝色的方案数如图。
不难发现,如果从南向北看到的都是红色,将这些红色方块全都平移到第一列去,那么会有一个高度为\(h\)的红色立方体,而这个\(h\)刚好是整行立方体最高的高度,其他任何颜色的立方体都不能超过这个高度。
于是,不妨设\(s(i,r,g,b,h)\)表示(一行中)前\(i\)列放\(r\)个红色,\(g\)个绿色,\(b\)个蓝色的方案数。
首先我们要枚举当前这列放多少个立方体(假设放\(r'\)个红,\(g'\)个绿,\(b'\)个蓝)
我们还需要枚举前\(i-1\)列中最高立方体的高度(假设为\(h\))
然后,状态转移方程也不难推出:
\[ s(i,r,g,b,\max(r'+g'+b',h))=\sum s(i-1,r-r',g-g',b-b',h)\times P(r'-x,g',b') \]
其中\(x\)指的是第\(i\)列超过前\(i-1\)列的最高高度的方块数,没有超过则为\(0\)
\(P(r,g,b)\)指的是红色\(r\)个,绿色\(g\)个,蓝色\(b\)个摆成一“栋”的所有方案数。即对\(r,g,b\)错排。
然后再求\(g(R,G,B)\)就容易多了。状态转移方程:
\[ g(R,G,B)=\sum\limits_{h=0}^{R}s(N,R,G,B,h) \]