正文

Zju 2271 Chance to Encounter a Girl2006-08-01 17:02:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/17074.html

分享到:

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;}

阅读(3494) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册