题解-建筑物

(〇)题目描述

有一个\(N\times N\)的单元格,在上面放置\(R\)个红色立方体,\(G\)个绿色立方体,\(B\)个蓝色立方体。要求从南向北看只能看见一种颜色的立方体(如图),求有多少种放法。

图1

(一)解题思路

这道题是一道计数类的问题,第一感觉应该就是\(DP\)了。

下面来分析一下\(DP\)是否可行。

首先,要确定\(DP\)的阶段。因为题目要求从南向北看要全是单一的颜色,那么我们可以将其分为三大类:

  1. 看到的都是红色
  2. 看到的都是绿色
  3. 看到的都是蓝色

不难发现,上述三类的做法其实都是一样的,那么我们只需要考虑一类的做法即可。

就拿第一类来考虑。

不难发现,单元格每一行其实都是独立的。也就是说,只需要保证每一行从南向北看都是红色就可以了。既然如此,\(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) \]

猜你喜欢

转载自www.cnblogs.com/GDOI2018/p/10543287.html