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. 2016年江西理工大学C语言程序设计竞赛(高级组)

    问题 A: jxust 解法:争议的问题(是输入整行还是输入字符串),这里倾向输入字符串,然后判断是否含有jxust就行 #include<bits/stdc++.h> using nam ...

  2. [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件

    原文:http://www.crifan.com/csharp_call_explorer_to_open_destinate_folder_and_select_specific_file/ C#中 ...

  3. 《BI那点儿事》数据流转换——排序

    排序转换允许对数据流中的数据按照某一列进行排序.这是五个常用的转换之一.连接数据源打开编辑界面,编辑这种任务.不想设置为排序列的字段不要选中,默认情况下所有列都会选中.如图所示,按照TotalSuga ...

  4. Js综合笔记

    -----网页禁止复制---- -----网页禁止复制---- <body> <SCRIPT language=javascript type=text/javascript> ...

  5. Deep Learning 4_深度学习UFLDL教程:PCA in 2D_Exercise(斯坦福大学深度学习教程)

    前言 本节练习的主要内容:PCA,PCA Whitening以及ZCA Whitening在2D数据上的使用,2D的数据集是45个数据点,每个数据点是2维的.要注意区别比较二维数据与二维图像的不同,特 ...

  6. Ajax中return false无效 怎么解决?

    var flag=0; $.ajax({ url:"widget?type=member_register&ajax=yes&action=checkname&use ...

  7. python核心编程第六章练习6-9

    6-9.转换.为练习5-13写一个姊妹函数,接受分钟数,返回小时数和分钟数.总时间不变,并且要求小时尽可能大.[答案]代码如下: #!/usr/bin/env python # translate m ...

  8. SQL SERVER 查看所有index

    WITH INDEX_TABLE AS( as DatabaseID, o.name AS TableName, c.name AS ColumnName,ic.index_id,i.type_des ...

  9. 关于OPencv版本不符合,相关库变化问题

    由于OPencv发展迅速,已经省略了很多原来的库文件,奈何自己才疏学浅,所以只能把OPencv 1.0中的相关版本中的库文件一直过去. 链接: http://pan.baidu.com/s/1qY1Z ...

  10. 测试秒杀新版本3.5 stieserver cms

    EXP: 直接访问UserCenter/login.aspx 用户名处输入: 123′insert into bairong_Administrator([UserName],[Password],[ ...