poj 2096 Collecting Bugs && ZOJ 3329 One Person Game && hdu 4035 Maze——期望DP
poj 2096
题目:http://poj.org/problem?id=2096
f[ i ][ j ] 表示收集了 i 个 n 的那个、 j 个 s 的那个的期望步数。
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define db double
- using namespace std;
- const int N=;
- db n,s,f[N][N];
- int main()
- {
- scanf("%lf%lf",&n,&s);db ml=n*s;
- for(int i=n;i>=;i--)
- for(int j=s;j>=;j--)
- {
- if(i==n&&j==s)continue;
- if(i<n)f[i][j]+=(n-i)*j/ml*f[i+][j];
- if(j<s)f[i][j]+=i*(s-j)/ml*f[i][j+];
- if(i<n&&j<s)f[i][j]+=(n-i)*(s-j)/ml*f[i+][j+];
- f[i][j]+=;
- f[i][j]*=ml/(ml-i*j);
- }
- printf("%.4f\n",f[][]);
- return ;
- }
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 。
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #define db double
- using namespace std;
- int rdn()
- {
- int ret=;bool fx=;char ch=getchar();
- while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
- while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
- return fx?ret:-ret;
- }
- const int N=,M=;
- int n,c[],t[]; db p[M],a[N],b[N];
- int main()
- {
- int T=rdn();
- while(T--)
- {
- n=rdn();for(int i=;i<=;i++)c[i]=rdn();
- for(int i=;i<=;i++)t[i]=rdn();
- db tp=1.0/(c[]*c[]*c[]); p[]=tp;
- int lm=c[]+c[]+c[];
- for(int i=;i<=lm;i++)p[i]=;//
- for(int i=;i<=c[];i++)
- for(int j=;j<=c[];j++)
- for(int k=;k<=c[];k++)
- {
- if(i==t[]&&j==t[]&&k==t[])continue;
- p[i+j+k]+=tp;
- }
- for(int i=;i<=n;i++)a[i]=p[],b[i]=;
- for(int i=n+,j=n+lm;i<=j;i++)a[i]=b[i]=;////
- for(int i=n;i>=;i--)
- for(int j=;j<=lm;j++)
- a[i]+=a[i+j]*p[j],b[i]+=b[i+j]*p[j];
- printf("%.10f\n",b[]/(-a[]));
- }
- return ;
- }
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 就可以了。
- #include<cstdio>
- #include<cstring>
- #include<algorithm>
- #include<cmath>
- #define db double
- using namespace std;
- int rdn()
- {
- int ret=;bool fx=;char ch=getchar();
- while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
- while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
- return fx?ret:-ret;
- }
- const int N=1e4+;const db eps=1e-;
- int n,hd[N],xnt,to[N<<],nxt[N<<],d[N];db k[N],e[N],s[N],a[N],b[N],c[N];
- void add(int x,int y){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;d[x]++;}
- void dfs(int cr,int fa)
- {
- db tp=;
- for(int i=hd[cr],v;i;i=nxt[i])
- if((v=to[i])!=fa)
- {
- dfs(v,cr);a[cr]+=a[v];c[cr]+=c[v];tp+=b[v];
- }
- a[cr]=a[cr]*s[cr]+k[cr]; b[cr]=s[cr]; c[cr]=c[cr]*s[cr]+d[cr]*s[cr];
- tp=-tp*s[cr];
- a[cr]/=tp; b[cr]/=tp; c[cr]/=tp;
- }
- int main()
- {
- int T=rdn();
- for(int t=;t<=T;t++)
- {
- n=rdn();memset(hd,,sizeof hd);xnt=;
- for(int i=;i<=n;i++)d[i]=;
- for(int i=,u,v;i<n;i++)
- u=rdn(),v=rdn(),add(u,v),add(v,u);
- for(int i=;i<=n;i++)
- {
- k[i]=(db)rdn()/;e[i]=(db)rdn()/;
- s[i]=(-k[i]-e[i])/d[i];
- a[i]=b[i]=c[i]=;
- }
- dfs(,); printf("Case %d: ",t);
- if(fabs(-a[])<=eps)puts("impossible");
- else printf("%.10f\n",c[]/(-a[]));
- }
- return ;
- }
poj 2096 Collecting Bugs && ZOJ 3329 One Person Game && hdu 4035 Maze——期望DP的更多相关文章
- POJ 2096 Collecting Bugs 期望dp
题目链接: http://poj.org/problem?id=2096 Collecting Bugs Time Limit: 10000MSMemory Limit: 64000K 问题描述 Iv ...
- POJ 2096 Collecting Bugs (概率DP,求期望)
Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...
- POJ 2096 Collecting Bugs
Collecting Bugs Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 1716 Accepted: 783 C ...
- poj 2096 Collecting Bugs(期望 dp 概率 推导 分类讨论)
Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other ...
- poj 2096 Collecting Bugs 概率dp 入门经典 难度:1
Collecting Bugs Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 2745 Accepted: 1345 ...
- Poj 2096 Collecting Bugs (概率DP求期望)
C - Collecting Bugs Time Limit:10000MS Memory Limit:64000KB 64bit IO Format:%I64d & %I64 ...
- poj 2096 Collecting Bugs 【概率DP】【逆向递推求期望】
Collecting Bugs Time Limit: 10000MS Memory Limit: 64000K Total Submissions: 3523 Accepted: 1740 ...
- POJ 2096 Collecting Bugs:期望dp
题目链接:http://poj.org/problem?id=2096 题意: 有一个程序猿,他每天都会发现一个bug. bug共有n个种类.属于某一个种类的概率为1/n. 有s个子系统,每个bug属 ...
- poj 2096 Collecting Bugs - 概率与期望 - 动态规划
Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other material stu ...
随机推荐
- 第 6 章 —— 依赖项注入(DI)容器 —— Ninject
有些读者只想理解 MVC 框架所提供的特性,而不想介入开发理念与开发方法学.笔者不打算让你改变 —— 这属于个人取向,而且你知道交付优质项目需要的是什么. 建议你至少粗略第看一看本章的内容,以明白哪些 ...
- IOS8-人机界面指南
[ISUX转译]iOS 8人机界面指南(一):UI设计基础 糖箔糊2014.09.23 文章索引 1.1 为iOS而设计(Designing for iOS) 1.1.1 以内容为核心(Defer t ...
- OC MRC之计数器的基本操作(代码分析)
/* 1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> ...
- ThreadPoolExecutor类
首先分析内部类:ThreadPoolExecutor$Worker //Worker对线程和任务做了一个封装,同时它又实现了Runnable接口, //所以Worker类的线程跑的是自身的run方法 ...
- chrome plugins
ehpomnigmfglbkmnboidmmhhmicfdmom_1_1_0知行-时间管理 必开 Adkill and Media Download Cnblogs Wz(博客园网摘) Kami - ...
- 安装淘宝cnpm镜像
$ npm install -g cnpm --registry=https://registry.npm.taobao.org
- UML(统一的建模语言)
1.软件开发与软件工程 任何事情都必须想清楚了,才能去做!这样才不会出现很多不必要的麻烦,软件开发亦是如此. 写代码前要想好:想要做什么?做成什么样?如何去做? 软件设计就是把软件开发想清楚的过程: ...
- 玩转X-CTR100 l STM32F4 l HMC5983/HMC5883L三轴磁力计传感器
我造轮子,你造车,创客一起造起来!塔克创新资讯[塔克社区 www.xtark.cn ][塔克博客 www.cnblogs.com/xtark/ ] 本文介绍X-CTR100控制器 扩展HMC ...
- 网页不能显示PNG验证码的解决办法
解决方法: 开始->运行,在运行输入框中输入 “regsvr32 c:\windows\system32\pngfilt.dll”(然后点击确定)如果在注册时出现 “已加载c:\windows\ ...
- 2.spring 学习
1.spring简单工程搭建 http://www.cnblogs.com/yun965861480/p/6278193.html 2.spring数据源 http://www.cnblogs.com ...