这是大黄dp分类里边的。。概率dp。。。但是看完之后我决定硬搞。。。。 #include <cstdio> #include <cstring> #include <iostream> #define MAXN 102 using namespace std; double tmp[MAXN][MAXN]; double dp[MAXN][MAXN]; double mpy[MAXN][MAXN]; int n; void init() { double k = 1.0/4.0; for(int i=1;i<n-1;i++) for(int j=1;j<n-1;j++) mpy[i][j] = k; k = 1.0/3.0; for(int i=1;i<n-1;i++) mpy[0][i] =mpy[n-1][i]=mpy[i][n-1]=mpy[i][0]=k; mpy[0][0]=mpy[0][n-1]=mpy[n-1][0]=mpy[n-1][n-1]=0.5; } int main(void) { while(cin>>n) { memset(dp,0.0,sizeof(dp)); dp[n/2][n/2]=1.0; tmp[n/2][n/2]=1.0; init(); double sum = 0; for(int i=0;i<n;i++) // 这是每天; { memcpy(tmp,dp,sizeof(dp)); dp[0][0] = tmp[0][1]/3.0+tmp[1][0]/3.0; dp[n-1][n-1] = tmp[n-1][n-2]/3.0+tmp[n-2][n-1]/3.0; dp[n-1][0] = tmp[n-2][0]/3.0+tmp[n-1][1]/3.0; dp[0][n-1] = tmp[0][n-2]/3.0+tmp[1][n-1]/3.0; for(int k=1;k<n-1;k++) for(int m=1;m<n-1;m++) dp[k][m] = tmp[k][m+1]*mpy[k][m+1]+tmp[k][m-1]*mpy[k][m-1]/ +tmp[k-1][m]*mpy[k-1][m]+tmp[k+1][m]*mpy[k+1][m]; for(int k=1;k<n-1;k++) { dp[0][k] = tmp[1][k]*mpy[1][k]+tmp[0][k+1]*mpy[0][k+1]+tmp[0][k-1]*mpy[0][k-1]; dp[n-1][k]= tmp[n-1][k-1]*mpy[n-1][k-1]+tmp[n-1][k+1]*mpy[n-1][k+1]+tmp[n-2][k]*mpy[n-2][k]; dp[k][n-1]= tmp[k+1][n-1]*mpy[k+1][n-1]+tmp[k-1][n-1]*mpy[k-1][n-1]+tmp[k][n-2]*mpy[k][n-2]; dp[k][0]=tmp[k+1][0]*mpy[k+1][0]+tmp[k-1][0]*mpy[k-1][0]+tmp[k][1]*mpy[k][1]; } sum += dp[n/2][i]; dp[n/2][i] = tmp[n/2][i] = 0.0; } printf("%.4lf/n",sum); } return 0; } 1A,,A之后又整了这个。。。 #include<stdio.h> double ans[49] = { 0.6667, 0.0000, 0.4074, 0.0000, 0.3361, 0.0000, 0.2928, 0.0000, 0.2629, 0.0000, 0.2407, 0.0000, 0.2233, 0.0000, 0.2092, 0.0000, 0.1975, 0.0000, 0.1875, 0.0000, 0.1789, 0.0000, 0.1714, 0.0000, 0.1648, 0.0000, 0.1589, 0.0000, 0.1536, 0.0000, 0.1487, 0.0000, 0.1443, 0.0000, 0.1403, 0.0000, 0.1366, 0.0000, 0.1332, 0.0000, 0.1300, 0.0000, 0.1270, 0.0000, 0.1243, 0.0000, 0.1217, 0.0000, 0.1192 }; int main(void) { int n; while (scanf("%d", &n) != EOF) { printf("%.4lf/n", ans[(n-3)/2]); } return 0; }