1.问题一:兔子的繁殖(斐波拉契数列)
? f[n]=f[n-1]+f[n-2]
\[
Fibonacci:f(n)=\frac{1}{\sqrt{5}}\left(\frac{1+\sqrt{5}}{2}\right)^n-\frac{1}{\sqrt{5}}\left(\frac{1-\sqrt{5}}{2}\right)^n
\]
问题二:凸三角形剖分/括号化问题/不同出栈次序数问题/二叉树个数问题(卡特兰数)
f[n]=f[2]f[n-1]+f[3]f[n-2]+...+f[n-1]f[2]=f[n-1](4*n-2)/(n+1)
\[
Catlan:f(n)=\frac{\left(2*n\right)!}{n!*\left(n+1\right)!}
\]
问题三:火柴。用n(1<=n<=2000)根火柴棍能组成多少个非负整数
分析:令c[x]表示数字x需要的火柴数(0<=x<=9),用f[i]来更新f[i+c[x]](相当于在这个数的后面加上x这个数),当i等于0的时候不允许使用数字0,而是当n>=6时,给答案单独加上1,代表整数0。
d[i+c[x]]+=d[i];
问题四:立方数之和。
输入正整数n(n<=1e4),求将n写成若干个正整数的立方和有多少种方案。比如21有3种写法,77有22种写法,9999有440,022,018,293种写法
分析:建立多段图。设结点(i,j)表示“使用不超过i的大小的整数的立方,累加和为j”的这个状态,设d(i,j)为从(0,0)到(i,j)的路径条数,则最终的答案就是d(21,n)(因为21^3>n)
\[
d[i][j+a*i*i*i]+=d[i-1][j]
\]
但是还可以再优化:
\[
d[i][j]+=d[i][j-i*i*i](类似完全背包)
\]
问题五:村民排队。
村子里现在有n个人(1<=n<=40,000)个人,有多少种方式可以把他们排成一列,使得没有人站在他父亲的前面(有些人的父亲可能不在村子里面),输出总方案数模上1e9+7
问题六:带标号连通图计数。
统计有n(n<=50)个顶点的连通图有多少个。图的顶点有编号。
分析:在不考虑连通的情况的时候,这n个带标号的点共能构成
\[
h(n)=2^{\frac{n(n-1)}{2}}
\]
张图(若考虑任意两点之间都有边,则共有(n-1)+(n-2)+...+1=n(n-1)/2条边,而每条边都有连或者不连的选择,所以是2^(n(n-1)/2)种,我们设连通的图为f(n),未连通的图共有g(n)张,则f(n)+g(n)=h(n)。
g(n)可以这样计算:设1所在连通分量有k个点,就有C(n-1,k-1)种情况。确定点集后,1所在连通分量有f(n)种情况,而其他连通分量有h(n-k)种情况,则:
\[
g(n)=\sum_{k=1}^{n-1}C(n-1,k-1)*f(k)*h(n-k)
\]
每次计算出g(n)后,应立刻计算出f(n)和h(n)。
原文地址:https://www.cnblogs.com/iwillenter-top1/p/11616130.html