【NOIP2012普及组】摆花

题目大意:有n种花,每种花都有它自己的数量a[i],现在要求将这些花按照编号从小到大排成m盆花的方案数。

题目数据规模很大而且最后答案要求取模,很明显需要用递推算法求解。递推算法求解有三步。

一、设状态函数,本题问的是用前n种花摆m盆的方案数。故设f(i,j)=用前i种花摆前j盆的方案数,最后的答案就是d[n][m]。

二、状态转移方程(递推方程)

         分析摆第i种花的时候,有min(a[i],j)种选择:不放、放一盆、放两盆、.......、放min(a[i],j)盆

         对应第i-1种花的状态是f(i-1,j)、f(i-1,j-1)、f(i-1,j-2)、.......、f(i-1,j-min(a[i],j))

         也就是达到第i种花的状态需要从第i-1种花的状态推出,由加法原理f(i,j)=f(i-1,j)+f(i-1,j-1)+f(i-1,j-2)+.......+f(i-1,j-min(a[i],j))

三、边界分析

         f(i,0)=1,其余为0

        因为论用多少种花摆0盆都只有一种方案——不摆


代码实现时,还需要注意j应该大于等于a[i]的前缀和,因为否则无论如何都不能摆出j盆花。


#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cstdlib>
#include<cstring>
#define maxn 105
#define mo 1000007
using nam
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值