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. shiro 从入门到放弃

    Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...

  2. 图论$\cdot$2-SAT问题

    2-SAT问题是这样的:有$n$个布尔变量$x_i$,另有$m$个需要满足的条件,每个条件的形式都是“$x_i$为真/假或者$x_j$为真/假”.比如:"$x_1$为真或者$x_3$为假“. ...

  3. 不同系统下的回车\r和换行\n,及其历史

    我们平时按下键盘上的‘回车键’,就能实现回车换行[我们在屏幕上所看到的就是光标移到了下一行的开头位置!!ps:不讨论软件实现的特殊功能,如word里的回车智能缩进].因此对这个按键更准确说应该叫做‘回 ...

  4. Android中插件开发篇之----应用换肤原理解析

    一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转 ...

  5. 网页设计中常用的19个Web安全字体

    来自http://www.jb51.net 在Web编码中,CSS默认应用的Web字体是有限的,虽然在新版本的CSS3,我们可以通过新增的@font-face属性来引入特殊的浏览器加载字体.但多数情况 ...

  6. c++实现螺旋矩阵分析总结

    螺旋矩阵,是这么一个东西: 1   2   3 8   9   4 7   6   5 这是一个,n*n的矩阵,由外向里一次递增,一环一环,就好像一个螺旋一样.不难想象,如果n=5,那么应该是这样的: ...

  7. 让下拉框中同时显示Key与Value

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  8. PDO数据库抽象层

    PDO的优势在于兼容性,但速度不如mysql和mysqli new PDO($dsn,$username,$passwd[,$options]) $options可以设置数据库连接属性,如: $opt ...

  9. Logistic回归模型和Python实现

    回归分析是研究变量之间定量关系的一种统计学方法,具有广泛的应用. Logistic回归模型 线性回归 先从线性回归模型开始,线性回归是最基本的回归模型,它使用线性函数描述两个变量之间的关系,将连续或离 ...

  10. Model Binding

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...