G.Human Pyramid
题目描述:
s 个 A 种人,剩下全是 B 种人,搭建 h 层人形金字塔。A 种人可以踩在 B 种人的身上,反之不可以。每种人内部都是相同的,问有多少种方案数。
数据范围:
$ 1\le h \le 100, 0 \le s\le \frac{1}{2}h(h + 1) $
题解:
看到数字三角形,方案数,首先想到了 DP 。笑死,根本不会 D .

可以发现,如果斜着某一列出现了一个 B ,则以该点为顶点的三角形全是 B 。而且该列的 B 必定是从下往上连续的。
设状态:
设状态 dp(i, j, k) 表示高度 i ,前 i 行(斜着看)总共有 j 个 B ,第 i 行至少有 k 个 B 的方案数。
找递推:
由于至少有 k 个 $ = $ 至少有 k + 1 个 $ + $ 恰好有 k 个
所以 $ dp(i, j, k) = dp(i, j, k + 1) + dp(i-1, j - k, k - 1) $
第 i 行使用 k 个时,第 i-1 行使用 k-1 个才满足
由递推方程可以得到循环顺序,i, j 正着遍历,k 倒着遍历
注意 k 的起点,首先 $ k \le j $ ,然后第 i 行最多有 i 个,所以 $ k \le min(i, j) $
代码:
1 | const int maxn = 1e2 + 10; |