[POJ3088]Push Botton Lock(dp||数学相关)
来源:互联网 发布:证券分析软件下载 编辑:程序博客网 时间:2024/06/03 14:09
题目描述
传送门
题意:给出n个不同的球,问把这些球放入若干个不同的盒子里的方案数。n<=11.
题解
很容易想到dp。f(i,j)表示将i个小球放入j个盒子里的方案数,那么
也就是说,f(i-k,j-1)为将i-k个球放入j-1个盒子里的方案数,那么第j个盒子应该放入k个球,除了已经放进去的i-k个,还剩下n-i+k个,所以这k个球有c(n-i+k,k)种选择。
网上有的说这道题是一个经典的第二类string数的问题。第二类string数本身的问题是“s(p,k)为将p个不同的东西放到k个相同的里面去”,而这道题其实p和k都无差别。那么答案应该为k!s(p,k),也就是将盒子全排一下。
s(p,k)的递推关系式为S(p,k)=k*s(p-1,k)+s(p-1,k-1) ,1<= k<=p-1;边界条件:S(p,p)=1 ,p>=0,S(p,0)=0 ,p>=1
关于第一类string数和第二类string数更详细的解释戳这里
我刚开始想错了,既用了组合数又用了阶乘,后来发现这两种方法单独做都可以,但是结合起来是没有道理的。
代码
#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define LL long long#define N 105int T,Case,n;LL c[N][N],f[N][N],ans;void clear(){ memset(f,0,sizeof(f));ans=0;}int main(){ scanf("%d",&T); for (int i=0;i<=11;++i) c[i][0]=1; for (int i=1;i<=11;++i) for (int j=1;j<=11;++j) c[i][j]=c[i-1][j]+c[i-1][j-1]; while (T--) { clear(); scanf("%d",&n); if (n>11) { printf("%d %d 0\n",++Case,n); continue; } for (int i=1;i<=n;++i) f[i][1]=1*c[n][i]; for (int i=2;i<=n;++i) for (int j=2;j<=i;++j) { for (int k=1;k<=i;++k) f[i][j]+=f[i-k][j-1]*c[n-i+k][k]; } for (int i=1;i<=n;++i) for (int j=1;j<=i;++j) ans+=f[i][j]; printf("%d %d %lld\n",++Case,n,ans); }}
总结
①dp要想清楚再写。最好是算一算样例。尤其是状态不要搞乱了。
0 0
- [POJ3088]Push Botton Lock(dp||数学相关)
- poj 3088 Push Botton Lock (dp+组合数学|斯特林数)
- 【POJ 3088】Push Botton Lock(dp+第二类斯特林数)
- poj 3088 Push Botton Lock(斯特林数+组合数学)
- POJ 3088 Push Botton Lock 笔记
- QAQ and twin lock [基础dp,数学]
- [BZOJ1025][SCOI2009]游戏(置换+背包dp+数学相关)
- 数学相关(未完成)
- [BZOJbegin][NOIP十连测第九场]小P的单调数列(数学相关+dp+bit)
- [BZOJ1584][Usaco2009 Mar]Cleaning Up 打扫卫生(dp+数学相关优化)
- [BZOJ1089][SCOI2003]严格n元树(dp+数学相关+高精度)
- hihocoder#1444 : Push Button II(DP)
- ZOJ 2775 Push Button Lock
- hdu4945(dp+组合数学)
- poj3088:Snowflake (Hash)
- 数学相关(更新ing)
- HDU 4708 Rotation Lock Puzzle(数学啊)
- 两个ListBox通过Botton互操作(添加删除)
- HTTP协议的几种请求方法
- mongodb的基本语法
- CSS生成内容
- Krpano 一个全景生成多张小地图
- android如何实现将文本复制到系统中
- [POJ3088]Push Botton Lock(dp||数学相关)
- DB_NAME,SID,ORACLE_SID等参数的剖析
- Oracle
- mysql数据仓库指南
- 隐藏系统软件盘
- __declspec(dllexport)和__declspec(dllimport)
- C++实现十六进制表示字符串
- Qt QSqlDatabase操作数据库概述
- 配置yum仓库,让生活更简单