uva 10081 Tight Words

递推

题意:给出n和k,可用的数字为0,1,2……k,一共有n位数字,现在要求得到一种排列,相邻两个数字相差不超过1,问这种排列的个数占全排列总数的比列

要得到全排列的个数就是(k+1)^n , 要得到这个特殊的排列个数用递推即可

dp[j][i]=dp[j-1][i-1]+dp[j][i-1]+dp[j+1][i-1];

dp[j][i]的意义为第i位数字填j有多少种可能,那么第i位填了j,第i-1必定只可能填j-1,j,j+1才能保证相邻两位差不超过1

但主要j=0和j=k的情况

另外dp数值要用double

 

#include <cstdio>
#include <cstring>
#define N 110
#define M 15
double dp[N][M];
int main()
{
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        if(m==0) { printf("100.00000\n"); continue; }
        memset(dp,0,sizeof(dp));
        for(int i=0; i<=m; i++) dp[1][i]=1;
        for(int i=2; i<=n; i++) //
            for(int j=0; j<=m; j++) //数字
            {
                if(j==0) dp[i][0]=dp[i-1][0]+dp[i-1][1];
                else if(j==m) dp[i][m]=dp[i-1][m]+dp[i-1][m-1];
                else for(int k=j-1; k<=j+1; k++) dp[i][j]+=dp[i-1][k];
            }
        double s=1,a=0;
        for(int i=0; i<=m; i++) a+=dp[n][i];
        a*=100;
        for(int i=1; i<=n; i++) s*=(m+1);
        printf("%.5f\n",a/s);
    }
    return 0;
}

 

posted @ 2013-02-17 21:21  Titanium  阅读(909)  评论(0编辑  收藏  举报