南京邮电oj 1222序关系计数问题

/* 解题报告: 转移方程:dp(0) = 1 dp(n) = c(n,1)*dn(n-1) + c(n,2)*dp(n-2) + ... +c(n,n)dp(0) c(n,1)为组合数 思路: 在a1?a2?a3?a4...an中肯定能找到某个m使a1=a2=a3=...=am<am+1?am+2?...?an前m个,根据组合公式可得 c(n,m),而后面的有dp(n-m),两个式子再乘,便是m情况下的种数,而一共的种数需要求和得到(对m=1 to n这 些情况求和) */ #include <iostream> #include <cstring> using namespace std; unsigned long long dp[51]; int main() { int n; while(cin>>n) { memset(dp, 0, sizeof(dp)); dp[0] = 1; for(int i=1; i<=n; i++) { unsigned long long temp = 1; for(int j=1; j<=i; j++) { temp = temp*(i-j+1)/j; //求阶乘 dp[i] +=temp*dp[i-j]; } } cout<<dp[n]<<endl; } return 0; }

你可能感兴趣的:(c)