题目翻译
一个充满好奇心的孩子有
N(5≤N≤500)
个积木。这些积木可以构建不同的阶梯。阶梯由
c(c≥2)
列组成,后一列的积木个数要比前一列积木个数要多(否则就不是阶梯了)。
下图包含了
N=11和N=5
的示例:
你的任务是写一个程序,输入N,输出Q——由正好N个积木搭成的阶梯有多少种。
样例输入
212
样例输出
995645335
题解
考虑
dpj
表示用了j个方块形成的阶梯有多少种。
那么
dpj→dpj+i
,其中i表示新增的一列高度为i,即需要i个积木。
#include <cstdio>
long long dp[512];
int main() {
int n, i, j;
scanf("%d", &n);
dp[0] = 1;
for (i = 1; i <= n; ++i)
for (j = n; j >= i; --j) // 倒过来排序类似背包
dp[j] += dp[j - i];
printf("%lld\n", dp[n] - 1);
return 0;
}