HDU 4405 Aeroplane chess

算法:

概率DP, dp[i] 表示到达i后还需要多少次可使游戏结束。。。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<iostream>
#include<vector>
#include<string>
#include<math.h>
#include<map>
#include<set>
#include<algorithm>
using namespace std;
#define Pe (1.0 / 6.0)

//概率DP 
int p[100010];
double dp[100010];//dp[i]表示到达i这个点后还要多少次可以游戏结束 

int main( )
{
   int N, M, a, b;
   while( scanf("%d%d",&N,&M), N||M )
   {
      memset(p, -1, sizeof(p));
      for( int i = 0; i < M; i++)
      {
         scanf("%d%d",&a,&b);
         p[a] = b;      
      }
      memset(dp, 0xff, sizeof(dp));
      for( int i = N; i <= N + 5; i++)
         dp[i] = 0;
      for( int i = N - 1; i >= 0; i--)
      {
          double temp = 0;
          if( p[i] != -1 )
            temp = dp[p[i]];
          else
          {//可以到达这五个状态 
           for( int j = i + 1; j <= i + 6; j++)
           {
              temp  += dp[j] * Pe;       
           }      
           temp += 1;
          }
          dp[i] = temp;  
      }     
      printf("%.4lf\n",dp[0]);  
   }
   return 0;
}

posted on 2012-09-22 21:44  more think, more gains  阅读(110)  评论(0编辑  收藏  举报

导航