poj 2096

题目:http://poj.org/problem?id=2096

f[ i ][ j ] 表示收集了 i 个 n 的那个、 j 个 s 的那个的期望步数。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define db double
  5. using namespace std;
  6. const int N=;
  7. db n,s,f[N][N];
  8. int main()
  9. {
  10. scanf("%lf%lf",&n,&s);db ml=n*s;
  11. for(int i=n;i>=;i--)
  12. for(int j=s;j>=;j--)
  13. {
  14. if(i==n&&j==s)continue;
  15. if(i<n)f[i][j]+=(n-i)*j/ml*f[i+][j];
  16. if(j<s)f[i][j]+=i*(s-j)/ml*f[i][j+];
  17. if(i<n&&j<s)f[i][j]+=(n-i)*(s-j)/ml*f[i+][j+];
  18. f[i][j]+=;
  19. f[i][j]*=ml/(ml-i*j);
  20. }
  21. printf("%.4f\n",f[][]);
  22. return ;
  23. }

ZOJ 3329

题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3754

高斯消元好像时间复杂度太高。

注意到每个位置都可以从 dp[ 0 ] 转移过来,所以可以想到每个 dp[ i ] 都可以表示成 a[ i ]*dp[ 0 ] + b[ i ] 的形式;这样如果算出了 a[ 0 ] 和 b[ 0 ] ,就能直接算出 dp[ 0 ] 了。

\( dp[i]=a[i]*dp[0]+b[i] \)

\( dp[i]=\sum\limits_{j=1}^{k}dp[i+j]*p[j] + dp[0]*p[0] + 1 \)

\( dp[i]=\sum\limits_{j=1}^{k}(a[i+j]*p[j]*dp[0]+b[i+j]*p[j]) + dp[0]*p[0] + 1 \)

\( dp[i]=((\sum\limits_{j=1}^{k}a[i+j]*p[j])+p[0])dp[0]+(\sum\limits_{j=1}^{k}b[i][j]*p[j])+1 \)

所以 \( a[i]=(\sum\limits_{j=1}^{k}a[i+j]*p[j])+p[0] \) , \( b[i]=(\sum\limits_{j=1}^{k}b[i][j]*p[j])+1 \)

注意多组数据的清零。空间不是 505 而是 525 。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define db double
  5. using namespace std;
  6. int rdn()
  7. {
  8. int ret=;bool fx=;char ch=getchar();
  9. while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
  10. while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
  11. return fx?ret:-ret;
  12. }
  13. const int N=,M=;
  14. int n,c[],t[]; db p[M],a[N],b[N];
  15. int main()
  16. {
  17. int T=rdn();
  18. while(T--)
  19. {
  20. n=rdn();for(int i=;i<=;i++)c[i]=rdn();
  21. for(int i=;i<=;i++)t[i]=rdn();
  22. db tp=1.0/(c[]*c[]*c[]); p[]=tp;
  23. int lm=c[]+c[]+c[];
  24. for(int i=;i<=lm;i++)p[i]=;//
  25. for(int i=;i<=c[];i++)
  26. for(int j=;j<=c[];j++)
  27. for(int k=;k<=c[];k++)
  28. {
  29. if(i==t[]&&j==t[]&&k==t[])continue;
  30. p[i+j+k]+=tp;
  31. }
  32. for(int i=;i<=n;i++)a[i]=p[],b[i]=;
  33. for(int i=n+,j=n+lm;i<=j;i++)a[i]=b[i]=;////
  34. for(int i=n;i>=;i--)
  35. for(int j=;j<=lm;j++)
  36. a[i]+=a[i+j]*p[j],b[i]+=b[i+j]*p[j];
  37. printf("%.10f\n",b[]/(-a[]));
  38. }
  39. return ;
  40. }

hdu 4035

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4035

设 f[ i ] 表示现在在 i 号点,期望走几步离开迷宫。

数据范围无法高斯消元。

考虑把 f[ i ] 表示成 a[ i ] * f[ 1 ] + b[ i ] 的形式,这样才能在知道系数之后算出 f[ 1 ] 。它是从 1 号点开始走的,所以应该能表示成这样。

只是这样的话,转移还是没有顺序的。所以考虑把 f[ i ] 表示成 a[ i ] * f[ 1 ] + b[ i ] * f[ fa ] + c[ i ] 的形式。

\( f[i] = k[i]*f[1]+e[i]*0 + \frac{1-k[i]-e[i]}{d[i]}(f[fa]+1) + \frac{1-k[i]-e[i]}{d[i]}\sum\limits_{j \in child}(f[j]+1) \)

\( f[i] = a[i]*f[1]+b[i]*f[fa]+c[i] \)   令 \( s[i]=\frac{1-k[i]-e[i]}{d[i]} \)

\( f[i]=k[i]*f[1]+s[i]*f[fa]+s[i]+(d[i]-1])s[i]+s[i]\sum\limits_{j \in child}(a[j]*f[1]+b[j]*f[i]+c[j]) \)

\( f[i]=k[i]*f[1]+s[i]*f[fa]+d[i]*s[i]+s[i]\sum\limits_{j \in child}a[j]*f[1]+s[i]\sum\limits_{j \in child}b[j]*f[i]+s[i]\sum\limits_{j \in child}c[j] \)

\( (1-s[i]\sum\limits_{j \in child}f[i]=(k[i]+s[i]\sum\limits_{j \in child}a[j])f[1]+s[i]*f[fa]+d[i]*s[i]+s[i]\sum\limits_{j \in child}c[j] \)

答案就是 \( \frac{c[1]}{1-a[1]} \) 。当 \( 1 = a[1] \) 时无解。

精度开成 1e-8 会 WA , 1e-9 就可以了。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. #define db double
  6. using namespace std;
  7. int rdn()
  8. {
  9. int ret=;bool fx=;char ch=getchar();
  10. while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
  11. while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
  12. return fx?ret:-ret;
  13. }
  14. const int N=1e4+;const db eps=1e-;
  15. int n,hd[N],xnt,to[N<<],nxt[N<<],d[N];db k[N],e[N],s[N],a[N],b[N],c[N];
  16. void add(int x,int y){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;d[x]++;}
  17. void dfs(int cr,int fa)
  18. {
  19. db tp=;
  20. for(int i=hd[cr],v;i;i=nxt[i])
  21. if((v=to[i])!=fa)
  22. {
  23. dfs(v,cr);a[cr]+=a[v];c[cr]+=c[v];tp+=b[v];
  24. }
  25. a[cr]=a[cr]*s[cr]+k[cr]; b[cr]=s[cr]; c[cr]=c[cr]*s[cr]+d[cr]*s[cr];
  26. tp=-tp*s[cr];
  27. a[cr]/=tp; b[cr]/=tp; c[cr]/=tp;
  28. }
  29. int main()
  30. {
  31. int T=rdn();
  32. for(int t=;t<=T;t++)
  33. {
  34. n=rdn();memset(hd,,sizeof hd);xnt=;
  35. for(int i=;i<=n;i++)d[i]=;
  36. for(int i=,u,v;i<n;i++)
  37. u=rdn(),v=rdn(),add(u,v),add(v,u);
  38. for(int i=;i<=n;i++)
  39. {
  40. k[i]=(db)rdn()/;e[i]=(db)rdn()/;
  41. s[i]=(-k[i]-e[i])/d[i];
  42. a[i]=b[i]=c[i]=;
  43. }
  44. dfs(,); printf("Case %d: ",t);
  45. if(fabs(-a[])<=eps)puts("impossible");
  46. else printf("%.10f\n",c[]/(-a[]));
  47. }
  48. return ;
  49. }

poj 2096 Collecting Bugs && ZOJ 3329 One Person Game && hdu 4035 Maze——期望DP的更多相关文章

  1. POJ 2096 Collecting Bugs 期望dp

    题目链接: http://poj.org/problem?id=2096 Collecting Bugs Time Limit: 10000MSMemory Limit: 64000K 问题描述 Iv ...

  2. POJ 2096 Collecting Bugs (概率DP,求期望)

    Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...

  3. POJ 2096 Collecting Bugs

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 1716   Accepted: 783 C ...

  4. poj 2096 Collecting Bugs(期望 dp 概率 推导 分类讨论)

    Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other ...

  5. poj 2096 Collecting Bugs 概率dp 入门经典 难度:1

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 2745   Accepted: 1345 ...

  6. Poj 2096 Collecting Bugs (概率DP求期望)

    C - Collecting Bugs Time Limit:10000MS     Memory Limit:64000KB     64bit IO Format:%I64d & %I64 ...

  7. poj 2096 Collecting Bugs 【概率DP】【逆向递推求期望】

    Collecting Bugs Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 3523   Accepted: 1740 ...

  8. POJ 2096 Collecting Bugs:期望dp

    题目链接:http://poj.org/problem?id=2096 题意: 有一个程序猿,他每天都会发现一个bug. bug共有n个种类.属于某一个种类的概率为1/n. 有s个子系统,每个bug属 ...

  9. poj 2096 Collecting Bugs - 概率与期望 - 动态规划

    Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...

随机推荐

  1. 第 6 章 —— 依赖项注入(DI)容器 —— Ninject

    有些读者只想理解 MVC 框架所提供的特性,而不想介入开发理念与开发方法学.笔者不打算让你改变 —— 这属于个人取向,而且你知道交付优质项目需要的是什么. 建议你至少粗略第看一看本章的内容,以明白哪些 ...

  2. IOS8-人机界面指南

    [ISUX转译]iOS 8人机界面指南(一):UI设计基础 糖箔糊2014.09.23 文章索引 1.1 为iOS而设计(Designing for iOS) 1.1.1 以内容为核心(Defer t ...

  3. OC MRC之计数器的基本操作(代码分析)

    /* 1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> ...

  4. ThreadPoolExecutor类

    首先分析内部类:ThreadPoolExecutor$Worker //Worker对线程和任务做了一个封装,同时它又实现了Runnable接口, //所以Worker类的线程跑的是自身的run方法 ...

  5. chrome plugins

    ehpomnigmfglbkmnboidmmhhmicfdmom_1_1_0知行-时间管理 必开 Adkill and Media Download Cnblogs Wz(博客园网摘) Kami - ...

  6. 安装淘宝cnpm镜像

    $ npm install -g cnpm --registry=https://registry.npm.taobao.org

  7. UML(统一的建模语言)

    1.软件开发与软件工程 任何事情都必须想清楚了,才能去做!这样才不会出现很多不必要的麻烦,软件开发亦是如此. 写代码前要想好:想要做什么?做成什么样?如何去做? 软件设计就是把软件开发想清楚的过程: ...

  8. 玩转X-CTR100 l STM32F4 l HMC5983/HMC5883L三轴磁力计传感器

    我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ]      本文介绍X-CTR100控制器 扩展HMC ...

  9. 网页不能显示PNG验证码的解决办法

    解决方法: 开始->运行,在运行输入框中输入 “regsvr32 c:\windows\system32\pngfilt.dll”(然后点击确定)如果在注册时出现 “已加载c:\windows\ ...

  10. 2.spring 学习

    1.spring简单工程搭建 http://www.cnblogs.com/yun965861480/p/6278193.html 2.spring数据源 http://www.cnblogs.com ...