zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    NTFS文件系统的主要优点体现在以下三个方面
    子网划分,主机号,网络号计算
    hdu1008
    hdu1006
    hdu1004
    Git 版本回退
    Git 提交修改内容和查看被修改的内容
    Git 怎么创建本地库,向本地库提交文件
    mybatis中#{}和${}的区别
    请求头和响应头
  • 原文地址:https://www.cnblogs.com/scau20110726/p/2914763.html
Copyright © 2011-2022 走看看