1990623 2006-08-01 16:53:10 Accepted 2271 C++ 00:00.77 8324K St.Crux 过的好不容易...... 要求A与B在不同时间点上相遇的概率和。很明显的dp,用不同的时间来区分状态。郁闷的是一开始居然看不懂样例...... p[t][i][k] = OMG([t - 1][ii][kk] / 概率) 这里iikk是与i,k相邻的点。 用了两个优化。一是算概率的时候可以用以下init的方法。二是染色!如5,9,13,17这样的是无解的:( #include <cstdio>#include <string> double p[101][100][100];int pos[100][100], n; int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; void init(){ for(int i = 0; i < n; i ++) { for(int k = 0; k < n; k ++) { pos[i][k] = 4; if(i == 0 || i == n - 1) pos[i][k] --; if(k == 0 || k == n - 1) pos[i][k] --; } }} int main(){ //freopen("in.txt", "r", stdin); while(scanf("%d", &n) != EOF) { memset(p, 0, sizeof(p)); init(); int t, i, k, u; double p_p = 1.0000, s_p = 0.0000; if((n - 3) % 4 == 0) { p[0][n / 2][n / 2] = p_p; for(t = 1; t <= n; t ++) { for(i = 0; i < n; i ++) { for(k = 0; k < n; k ++) { p_p = 0.0000; for(u = 0; u < 4; u ++) { int ii = i + dir[u][0]; int kk = k + dir[u][1]; if(kk >= 0 && kk < n && ii >= 0 && ii < n) { p_p += p[t - 1][ii][kk] / pos[ii][kk]; } } p[t][i][k] = p_p; } } s_p += p[t][n / 2][t - 1]; p[t][n / 2][t - 1] = 0; } } //pt(); printf("%0.4f\n", s_p); } return 0;}

评论