POJ 1671

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

题解: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 }

你可能感兴趣的:(poj)