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. java 中继承,组合,重载,重写的实现原理 (转)

    我们知道,继承,组合,重载,重写是java语言的面向对象实现的基本特征. 那么在java内部,究竟是如何实现这些面对对象的基本特征的呢? 继承和组合是面向对象中代码复用的主要实现方式,他们可以达到类似 ...

  2. python中的正则表达式(re模块)

    一.简介 正则表达式本身是一种小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,程序媛们可以直接调用来实现正则匹配.正则表达式模式被编译成一系列的字节码,然后由用C编写的匹配引擎 ...

  3. C# Cookie工具类

    /// <summary> /// Cookies赋值 /// </summary> /// <param name="strName">主键& ...

  4. epoll实现压测工具

    代码: /* * g++ -o stress_test ./stress_test.cpp */ #include <stdlib.h> #include <stdio.h> ...

  5. C中字符串的几种定义方法及说明

    在C中定义字符串有下列几种形式:字符串常量,char数组,char指针 1.字符串常量 即:位于一对双括号中的任何字符.双引号里的字符加上编译器自动提供的结束标志\0字符,作为 一个字符串存储在内存中 ...

  6. double函数和int函数

    可以看到,当tensor全是double型时,int函数会把所有元素取整,从1.5可以看出,不是四舍五入,而是取整.double函数又把整数型元素变成double型. th> a 0.0000 ...

  7. 我的android学习经历36

    最近把android的基础知识都学的差不多了,也写了许多demo,就想自己写一个app,可是写到后面的时候发现很混乱,所以还是得写一些文档,用xml语言写一下基础的类以及一些其他的东西.所以要想写一个 ...

  8. nRF52系列来袭,Nordic的低功耗蓝牙方案大有可为

      坐落在北欧的挪威不像他的邻居芬兰那样,可以先后依靠NOKIA和愤怒的小鸟在世界科技界享有盛名.在一般人看来,挪威除了一个逐渐式微的Opera浏览器以外,并没有更多拿得出手的科技企业.而事实证明这只 ...

  9. consul的安装配置 一centos7环境

    centos7上consul的安装--新手笔记 环境 我用的是centos7, 用的是vmware 一 安装系统后首先要设置ip ifconfig eth0 →查看IP 不过输出的信息多一些 ifco ...

  10. Java 中的 static 使用之静态方法

    与静态变量一样,我们也可以使用 static 修饰方法,称为静态方法或类方法.其实之前我们一直写的 main 方法就是静态方法.静态方法的使用如: 运行结果: 需要注意: 1. 静态方法中可以直接调用 ...