题目描述
小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。
试编程计算,一共有多少种不同的摆花方案。
Solution
我表示…好尴尬啊…看到题目,然后一写完就直接…AC啦?作为一个蒟蒻无法相信能做出普及T3…这就是传说中的RP来了吗
然后一看题解,又是判断越界的,又是用滚动数组的,又是各种用深搜的,太强啦,都是大佬啊,作为蒟蒻不懂…就这么过了妈呀数据好水…
那好吧,言归正传:这道题目作为普及组的T3确实有点水了,我们可以用最简单的二维动态规划来解决这道题目,即:
设f[i][j]为选择了前i种花,一共选择了j盆花的方案数总和.
然后初始化就是:f[0][0]=1(不要问我为什么,蒟蒻认为一般二维的要求方案数的动态规划都是f[0][0]=1吧)
然后,激动人心的状态转移方程登场啦:f[i][j]的转移必须与前i-1种花的方案数有关,即f[i-1][…]然后又和前面计算的总和有关,当我们不知道最后的总和确切是几,这种花到底选几盆,因此我们多一层循环k来枚举选这朵花的数量,方然也可以不选…
然后,闪亮登场啦: f [ i ] [ j ] = s u m ( f [ i − 1 ] [ j − k ] ) 0 ≤ k