BZOJ 1415

 #include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int Maxn=;
int t[Maxn],n,m,S,T,now,p[Maxn][Maxn],head[Maxn],dis[Maxn],u,v,cnt;
double f[Maxn][Maxn];
struct EDGE
{
int to,next;
}edge[Maxn<<];
inline void Add(int u,int v)
{edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt++;}
void Dfs(int u,int top)
{
for (int i=head[u];i!=-;i=edge[i].next)
if (dis[edge[i].to]==- || dis[edge[i].to]>dis[u]+ || (dis[edge[i].to]==dis[u]+ && p[now][edge[i].to]>top))
{
dis[edge[i].to]=dis[u]+;
p[now][edge[i].to]=top;
Dfs(edge[i].to,top);
}
}
double F(int S,int T)
{
if (f[S][T]!=) return f[S][T];
if (S==T) return ;
if (p[p[S][T]][T]==T || p[S][T]==T) return ;
double res=;
for (int i=head[T];i!=-;i=edge[i].next)
res+=F(p[p[S][T]][T],edge[i].to);
res+=F(p[p[S][T]][T],T);
res/=(double)(t[T]+1.0);
res+=;
return f[S][T]=res;
}
int main()
{
scanf("%d%d",&n,&m);
scanf("%d%d",&S,&T);
memset(head,-,sizeof(head));
for (int i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
Add(u,v),Add(v,u);
t[u]++; t[v]++;
} for (int i=;i<=n;i++)
{
memset(dis,-,sizeof(dis));
dis[i]=;
for (int j=head[i];j!=-;j=edge[j].next)
{
now=i;
dis[edge[j].to]=;
Dfs(edge[j].to,edge[j].to);
}
for (int j=head[i];j!=-;j=edge[j].next) p[i][edge[j].to]=edge[j].to;
}
printf("%.3lf\n",F(S,T));
return ;
}

C++

BZOJ 1419

 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int Maxn=;
double f[][Maxn];
int R,B,cur;
inline double Max(double x,double y) {return x>y?x:y;}
int main()
{
scanf("%d%d",&R,&B);
for (int i=;i<=R;i++)
{
cur^=;
for (int j=;j<=B;j++)
{
if (i==) {f[cur][j]=; continue;}
if (j==) {f[cur][j]=f[cur^][j]+;continue;}
f[cur][j]=Max(,(f[cur^][j]+1.0)*((double)(i)/(double)(i+j))+(f[cur][j-]-1.0)*((double)(j)/(double)(i+j))); }
}
printf("%.6lf\n",f[cur][B]-5e-);
return ;
}

C++

算法合集之《浅析竞赛中一类数学期望问题的解决方法》中有对题目的讲解。

HDU 4405 期望貌似是倒着推的,F[i]=∑F[i+k](k=1~6) /6+1;  但因为又加了一步所以要加一。可以直接跳到的则期望是一样的。

 #include <cstdio>
#include <cstring>
const int Maxn=;
int vis[Maxn],n,m,u,v;
double F[Maxn];
int main()
{
while (scanf("%d%d",&n,&m)!=EOF)
{
if (n== && m==) break;
memset(vis,-,sizeof(vis));
for (int i=;i<=m;i++) scanf("%d%d",&u,&v),vis[u]=v;
memset(F,,sizeof(F));
for (int i=n-;i>=;i--)
if (vis[i]==-)
{
for (int j=;j<=;j++) F[i]+=F[i+j]/6.0;
F[i]=F[i]+;
} else
F[i]=F[vis[i]];
printf("%.4lf\n",F[]);
}
return ;
}

C++

HDU 4089 至今还不是很清楚怎么退的。。

 #include <cstdio>
const int Maxn=;
const double eps=1e-;
double F[Maxn][Maxn],p1,p2,p3,p4,x[Maxn],z[Maxn];
int n,m,k;
int main()
{
while (scanf("%d%d%d%lf%lf%lf%lf",&n,&m,&k,&p1,&p2,&p3,&p4)!=EOF)
{
if (p4<eps) {puts("0.00000");continue;}
double p21=p2/(-p1),p31=p3/(-p1),p41=p4/(-p1);
F[][]=p4/(-p2-p1);
for (int i=;i<=n;i++)
{
x[]=p21; z[]=p41;
for (int j=;j<=i;j++)
{
x[j]=x[j-]*p21;
z[j]=p31*F[i-][j-]+p21*z[j-];
if (j<=k) z[j]+=p41;
}
F[i][i]=z[i]/(-x[i]);
for (int j=;j<i;j++) F[i][j]=x[j]*F[i][i]+z[j];
}
printf("%.5lf\n",F[n][m]);
}
return ;
}

C++

POJ 2096 一直末状态推终状态。

 #include<cstdio>
const int Maxn=;
double F[Maxn][Maxn];
int n,s;
int main()
{
while(scanf("%d%d",&n,&s)!=EOF)
{
F[n][s]=;
for(int i=n;i>=;i--)
for(int j=s;j>=;j--)
{
if(i==n && j==s) continue;
F[i][j]=(i*(s-j)*F[i][j+]+(n-i)*j*F[i+][j]+(n-i)*(s-j)*F[i+][j+]+n*s)/(n*s-i*j);
}
printf("%.4f\n",F[][]);
}
return ;
}

C++

POJ 3744 矩阵乘法加速线性表达式递推。

 #include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int Maxn=;
struct Matrix {double a[][]; int x,y;};
int n,a[Maxn];
double p,Ans;
inline Matrix operator * (Matrix A,Matrix B)
{
Matrix C; C.x=A.x,C.y=B.y;
memset(C.a,,sizeof(C.a));
for (int i=;i<=A.x;i++)
for (int j=;j<=A.y;j++)
for (int k=;k<=B.y;k++)
C.a[i][j]+=A.a[i][k]*B.a[k][j];
return C;
}
inline Matrix Pow(Matrix x,int y)
{ Matrix Ret; Ret.x=,Ret.y=;
memset(Ret.a,,sizeof(Ret.a));
Ret.a[][]=Ret.a[][]=; while (true)
{
if (y&) Ret=Ret*x;
x=x*x; y>>=;
if (y==) break;
}
return Ret;
} double Get(int t)
{
if (t<=) return ;
if (t==) return ;
if (t==) return p;
t-=;
Matrix M;
M.x=M.y=;
M.a[][]=p;
M.a[][]=-p;
M.a[][]=;
M.a[][]=;
M=Pow(M,t);
return M.a[][]*p+M.a[][];
} int main()
{
while (scanf("%d%lf",&n,&p)!=EOF)
{
for (int i=;i<=n;i++) scanf("%d",&a[i]);
sort(a+,a+n+);
Ans=;
for (int i=;i<=n;i++)
Ans=Ans*Get(a[i]-a[i-])*(1.0-p);
printf("%.7lf\n",Ans);
}
return ;
}

C++

POJ 3071 直接DP即可

 #include <cstdio>
#include <cstring>
double F[][],p[][];
int n,Ans;
int main()
{
while (scanf("%d",&n)!=EOF)
{
if (n==-) break;
memset(F,,sizeof(F));
for (int i=;i<=(<<n);i++)
for (int j=;j<=(<<n);j++) scanf("%lf",&p[i][j]);
for (int i=;i<=(<<n);i++) F[][i]=1.0;
for (int i=;i<=n;i++)
for (int j=;j<=(<<n);j++)
for (int k=;k<=(<<n);k++)
if (((j-)>>(i-)^)==((k-)>>i-))
F[i][j]+=F[i-][j]*F[i-][k]*p[j][k];
double Ret=;
for (int i=;i<=(<<n);i++)
if (F[n][i]>Ret) Ans=i,Ret=F[n][i];
printf("%d\n",Ans);
}
return ;
}

C++

期望DP的更多相关文章

  1. 【BZOJ-1419】Red is good 概率期望DP

    1419: Red is good Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 660  Solved: 257[Submit][Status][Di ...

  2. [NOIP2016]换教室 D1 T3 Floyed+期望DP

    [NOIP2016]换教室 D1 T3 Description 对于刚上大学的牛牛来说, 他面临的第一个问题是如何根据实际情况中情合适的课程. 在可以选择的课程中,有2n节课程安排在n个时间段上.在第 ...

  3. HDU 4336 Card Collector (期望DP+状态压缩 或者 状态压缩+容斥)

    题意:有N(1<=N<=20)张卡片,每包中含有这些卡片的概率,每包至多一张卡片,可能没有卡片.求需要买多少包才能拿到所以的N张卡片,求次数的期望. 析:期望DP,是很容易看出来的,然后由 ...

  4. 【BZOJ-4008】亚瑟王 概率与期望 + DP

    4008: [HNOI2015]亚瑟王 Time Limit: 20 Sec  Memory Limit: 512 MBSec  Special JudgeSubmit: 832  Solved: 5 ...

  5. 期望dp BZOJ3450+BZOJ4318

    BZOJ3450 概率期望DP f[i]表示到i的期望得分,g[i]表示到i的期望长度. 分三种情况转移: ① s[i]=‘x’:f[i]=f[i-1],g[i]=0 ② s[i]=‘o’:f[i]= ...

  6. HDU 4405 期望DP

    期望DP算是第一题吧...虽然巨水但把思路理理清楚总是好的.. 题意:在一个1×n的格子上掷色子,从0点出发,掷了多少前进几步,同时有些格点直接相连,即若a,b相连,当落到a点时直接飞向b点.求走到n ...

  7. POJ 2096 【期望DP】

    题意: 有n种选择,每种选择对应m种状态.每种选择发生的概率相等,每种选择中对应的每种状态发生的概率相等. 求n种选择和m种状态中每种至少发生一次的期望. 期望DP好别扭啊.要用倒推的方法. dp[i ...

  8. ZOJ 3822 Domination 期望dp

    Domination Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/showProblem ...

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

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

  10. uva11600 状压期望dp

    一般的期望dp是, dp[i] = dp[j] * p[j] + 1; 即走到下一步需要1的时间,然后加上 下一步走到目标的期望*这一步走到下一步的概率 这一题,我们将联通分块缩为一个点,因为联通块都 ...

随机推荐

  1. 使用git建立远程仓库,让别人git clone下来

    首先, 如果你的ssh没有安装的话,要安装ssh服务端.ubuntu是很简单 sudo apt-get install openssh-server 1,建立你的git 目录. ourunix@ubu ...

  2. python学习之字典

    1.字典 列表存储的数据比较单一也不够灵活,这时我们可以使用字典来存储某些多内容的数据,字典是无顺序的 1.简单的字典 book={ 'huqiang':13457412571, 'Jasper':1 ...

  3. JavaEE程序员必读图书大推荐

    下面是我根据多年的阅读和实践经验,给您推荐的一些图书: 第一部分: Java语言篇 1 <Java编程规范> 星级: 适合对象:初级,中级 介绍:作者James Gosling(Java之 ...

  4. SQL 是什么?

    一.简介   SQL,Structured Query Language,结构化查询语言.  

  5. Hibernate的关联映射——单向1-1关联

    Hibernate的关联映射--单向1-1关联 对于单向的1-1关联关系,需要在持久化类里增加代表关联实体的成员变量,并为该成员变量添加setter方法和getter方法.从持久化类的代码上看,单向1 ...

  6. 【leetcode❤python】 396. Rotate Function

    #-*- coding: UTF-8 -*- #超时#        lenA=len(A)#        maxSum=[]#        count=0#        while count ...

  7. Dialog , ProgressDialog , PopWindow 区别

    本质区别: Dialog:非阻塞对话框,弹出对话框时时,后台还可以做事情,点击背景时,对话框消失 ProgressDialog:带有圆形进度或者条形进度的对话框,一般结合handler使用.任务完成后 ...

  8. max-width实现图片的自适应

    在自适应布局中,有时候会让图片随着宽度的变化相应的放大或者缩小,或者说让图片等比缩放,但是每个图片的大小又不一样,这个时候我们就要用到max-width这个属性了. img{ max-width:10 ...

  9. [linux] Upgrading glibc for the GHOST Vulnerability

    1> Test if the problem exists, code: #include <netdb.h> #include <stdio.h> #include & ...

  10. sqlAlchemy 按DateTime字段的年或月进行group_by查询

    一.根据”create_date“查询每天的数据 1.查询2016年5月每天的数据 session.query(extract('day', User.create_date).label('day' ...