HDU4405Aeroplane_chess
Posted 蒟蒻LQL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU4405Aeroplane_chess相关的知识,希望对你有一定的参考价值。
题意
飞行棋。有n+1格,开始时在0号格子,每一步都要扔一个dice(六个面,概率相同)哪一面朝上他就会向前走x+i步。当x+i大于等于N的时候,游戏结束。另外,地图上有m条航线。第i条航线可以直接从xi到yi。计算扔dice次数的期望。
分析
这个题有一个默认的条件,如果当前格子有航线可以选择,那么就一定选择航线而不是掷色子。
最简单的概率DP,状态的定义需要从后往前定义,因为航线的缘故只能从后往前转移。
定义f[i]为 从第i个格子到n个格子的期望次数是多少。
如果i格子有航线那么 f[i]=f[to] ,to是航线可以到达的格子。
如果i格子没有航线,那么f[i]=sum(1/6*f[i+k])+1,其中k是色子的六个面(1,2,3,4,5,6)。
code
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 6 using namespace std; 7 const int maxn=100000+100; 8 int n,m; 9 int line[maxn]; 10 double f[maxn]; 11 int main(){ 12 while(scanf("%d%d",&n,&m)!=EOF&&(n||m)){ 13 memset(f,0,sizeof(f)); 14 memset(line,-1,sizeof(line)); 15 16 int x,y; 17 for(int i=1;i<=m;i++){ 18 scanf("%d%d",&x,&y); 19 line[x]=y; 20 } 21 for(int i=n-1;i>=0;i--){ 22 if(line[i]!=-1){ 23 f[i]=f[line[i]]; 24 } 25 else{ 26 for(int j=1;j<=6;j++){ 27 int to=min(n,i+j); 28 f[i]+=(f[to]+1)*(double)1/6; 29 } 30 31 } 32 } 33 /* for(int i=0;i<=n;i++){ 34 printf("%d %.4f\n",i,f[i]); 35 }*/ 36 printf("%.4f\n",f[0]); 37 } 38 return 0; 39 }
以上是关于HDU4405Aeroplane_chess的主要内容,如果未能解决你的问题,请参考以下文章
(HDU 4405) Aeroplane chess (概率DP)
HDU - 4405 Aeroplane chess(概率dp)
HDU 4405 Aeroplane chess(概率dp)
HDU 4405 ?Aeroplane chess(期望dp)