首页 > 代码库 > hdu 4405 概率dp 2012年金华亚洲网络赛--虽然水,但是是自己独立做的第一道概率dp
hdu 4405 概率dp 2012年金华亚洲网络赛--虽然水,但是是自己独立做的第一道概率dp
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4405
e[i]:当前在位置i还需要走的步数期望
受刘汝佳的AC自动机那个后缀链接写法的启发,我的x[i]通过逆序算出来连续有“flight line ”的时候,能到达的最远距离,
rep(i,0,m) { scanf("%d%d",&xx,&yy); x[xx]=yy; } for(int i=n;i>=0;i--) if(x[i]!=-1 && x[x[i]] != -1) x[i]=x[x[i]];写的时候犯了一个二逼错误导致我以为自己方程推错了,,,见注释
#include <cstdio> #include <iostream> #include <cstring> using namespace std; #define rep(i,s,e) for(int i=s;i<e;i++) #define repe(i,s,e) for(int i=s;i<=e;i++) #define reped(i,s,e) for(int i=s;i>=e;i--) #define arclr(aa,v) memset(aa,v,sizeof(aa)) const double p=1.0/6; const int MAXN = 100000+30; double e[MAXN],p2; int x[MAXN]; int main() { //freopen("hdu4405.txt","r",stdin); int xx,yy,n,m; while(~scanf("%d%d",&n,&m) && n+m) { //p2=m*1.0/n; arclr(x,0xff); rep(i,0,m) { scanf("%d%d",&xx,&yy); x[xx]=yy; } for(int i=n;i>=0;i--) if(x[i]!=-1 && x[x[i]] != -1) x[i]=x[x[i]]; arclr(e,0); reped(i,n-1,0) { if(x[i]==-1) { reped(j,6,1) e[i]+=e[i+j]; e[i]=e[i]/6.0+1; continue; } if(x[i]!=-1 && x[x[i]] != -1) { e[x[i]]=e[x[x[i]]]; x[i]=x[x[i]];//写成x[i]=x[i+x[i]],二逼了 } e[i]=e[x[i]]; } printf("%.4lf\n",e[0]); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。