递推
题意:给出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; }