题意:太难翻译了。。。只可意会,不可言传。。。

题解:dp[i][j]为长度为i且含j个不同节拍的方法种数,那么dp[i][j]=dp[i-1][j-1]+dp[i-1][j]*j,即多出的节拍独自一种或者与前面某种相同。后来证实,这就是第二类string数

View Code
 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 double dp[100][100];
 6 int main()
 7 {
 8     memset(dp,0,sizeof(dp));
 9     dp[0][0]=1;
10     for(int i=1;i<100;i++)
11     {
12         for(int j=1;j<=i;j++)
13             dp[i][j]=dp[i-1][j]*j+dp[i-1][j-1];
14     }
15     int n;
16     while(scanf("%d",&n),n)
17     {
18         double ans=0;
19         for(int i=1;i<=n;i++)
20             ans+=dp[n][i];
21         printf("%d %.0lf\n",n,ans);
22     }
23     return 0;
24 }