http://acm.hdu.edu.cn/showproblem.php?pid=2200
17
解析:这题我用递推写出来了,设f[n]表示结果,max[n]表示n个数中最大的;
(1)当方法中不包含max[n],是可知f1[n]==f[n-1]
(2)当方法中包含max[n]时
1)当大的一边除了max[n]还有其他数时,相当于在f[n-1]所有方法大的一边加入max[n],数量也为f[n-1]
2)当大的一边只有max[n]时, 另一边不管怎么取肯定是较小的,相当于在n-1个数之中取1、2、3、---n-1个数,
结果为C(1, n-1)+C(2, n-1)+C(3, n-1)-----+C(n-1, n-1)==2^(n-1)-C(0, n-1)==2^(n-1)-1,这一步是根据高中的知识,二项式展开可得,
例如(1+1)^2==C(0, 1)+C(1, n)+……+C(n, n)=2^n
所以f2[n]=f[n-1]+2^n-1;
所以综上所述f[n]==f1[n]+f2[n]==2*f[n-1]+2^n-1;代码实现就很简单了。
# include <iostream> # include <math.h> # include <stdlib.h> using namespace std; long long int f[500]; int main(){ int n, i, j, k; while(cin>>n){ f[2]=1; for(i=3; i<=n; i++){ f[i]=2*f[i-1]+pow(2, i-1)-1; } cout<<f[n]<<"\n"; } return 0; }