http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2623

The number of steps

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

Mary stands in a strange maze, the maze looks like a triangle(the first layer have one room,the second layer have two rooms,the third layer have three rooms …). Now she stands at the top point(the first layer), and the KEY of this maze is in the lowest layer’s leftmost room. Known that each room can only access to its left room and lower left and lower right rooms .If a room doesn’t have its left room, the probability of going to the lower left room and lower right room are a and b (a + b = 1 ). If a room only has it’s left room, the probability of going to the room is 1. If a room has its lower left, lower right rooms and its left room, the probability of going to each room are c, d, e (c + d + e = 1). Now , Mary wants to know how many steps she needs to reach the KEY. Dear friend, can you tell Mary the expected number of steps required to reach the KEY?

 

输入

There are no more than 70 test cases.

 
In each case , first Input a positive integer n(0<n<45),
The input is terminated with 0. This test case is not to be processed.

输出

Please calculate the expected number of steps required to reach the KEY room, there are 2 digits after the decimal point.

示例输入

3
0.3 0.7
0.1 0.3 0.6
0

示例输出

3.41

提示

 

来源

2013年山东省第四届ACM大学生程序设计竞赛

示例程序

分析:

第一行有一个位置,第二行两个,第三行三个......第n行n个。此时你在最左上角的位置,如果你左面没有位置,只能往左下和右下走,概率(a,b)。否则可以往左,左下和右下三个方向走,,概率(c,d,e)。让你求到达最左下角的期望。

先科普一下数学期望吧:

首先,来看下期望有啥基本的公式。对离散型随机变量x,其概率为p,有

对随机变量A、B,有 

第二个式子表明了期望有线性的性质,简单理解就是期望之间可根据关系,简单运算(不严谨的理解)。 这就为我们解决一个期望问题,不断转化为解决另外的期望问题,最终转化到一个已知的期望上。

举一个求期望最简单的例子,见下图:

假设有个人在 1号节点处,每一分钟他会缘着边随机走到一个节点或者在原地停留,问他走到4号节点需要平均几分钟?

这是个简单的期望问题,我们用Ei(i=1,2,3,4) 表示从i号节点走到4号节点的数学期望值。根据题意对1号节点有

      E1=(1/3)*E1+(1/3)*E2+(1/3)*E3+1 ①

表示 他下一分钟可以走到2或者3或在原地1,每个可能概率是1/3 ,注意是下一分钟,故要加上1.

同理我们对节点2,3同样可以列出:

      E2=(1/3)*E1+(1/3)*E2+(1/3)*E4+1 ②

      E3=(1/3)*E1+(1/3)*E3+(1/3)*E4+1 ③

那E4等于多少呢? 很明显

      E4=0 ④

因为他就是要到点4

这样上面1234式其实就是组成了一组方程组,解方程组就可得出E1!!,用高斯消元,复杂度是O(n^3)

从上述例子,我们可总结出如何解决期望类问题,根据题意,表示出各个状态的期望(上例的Ei,1234),根据概率公式,列出期望之间的方程,解方程即可。

AC代码:

 #include<stdio.h>
#include<string.h>
double dp[][];
int main()
{
int t;
while(scanf("%d",&t),t)
{
int i,j;
double a,b,c,d,e;
scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e);
memset(dp,,sizeof(dp));
dp[t][]=;
for(i=;i<=t-;i++)
{
dp[t][i+]+=(dp[t][i]+);
}
for(i=t-;i>=;i--)
{
dp[i][]+=a*(dp[i+][]+)+b*(dp[i+][]+);
for(j=;j<=i;j++)
dp[i][j]+=c*(dp[i+][j]+)+d*(dp[i+][j+]+)+e*(dp[i][j-]+);
}
printf("%.2lf\n",dp[][]);
}
return ;
}

官方标程:

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <string>
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
#define MAXN 1000
#define eps 1e-8
double Atex[MAXN][MAXN];
double a[], b[];
int all;
inline int dcmp(double d) {
return d < -eps ? - : d > eps;
} void gauss(int n, int m)
{
int r,c,i,j;
for(r=c=; r<n&&c<m; r++,c++)
{
for(i=r;i<n;i++)
if(dcmp(Atex[i][c])) break;
if(i==n)//{r--;continue;}
return;
if(i!=r) for(j=c;j<=m;j++) swap(Atex[i][j],Atex[r][j]);
for(i=r+;i<n;i++)
if(Atex[i][c]!=)
{
double temp=Atex[i][c]/Atex[r][c];
for(j=c;j<=m;j++)
Atex[i][j]-=Atex[r][j]*temp;
}
}
for(i=n-;i>=;i--)
{
Atex[i][m]/=Atex[i][i];
Atex[i][i]=;
for(j=i-;j>=;j--) Atex[j][m]-=Atex[i][m]*Atex[j][i];
}
return;
} void makemap(int n) {
memset(Atex, , sizeof(Atex));
all = (+n)*n/;
for (int i = ; i < all; i ++) {
Atex[i][i] = ;
Atex[i][all] = ;
}
int t = , tt;
for (int i = ; i < n-; i ++) {
tt = t + i+;
Atex[t][tt] = -*a[];
Atex[t][tt+] = -*a[];
for (int j = t+; j < tt; j ++) {
Atex[j][j+i+] = -*b[];
Atex[j][j+i+] = -*b[];
Atex[j][j-] = -*b[];
}
t = tt;
}
Atex[t][all] = ;
for (int i = t+; i < all; i ++) {
Atex[i][i-] = -;
}
} int main()
{
int n;
while(scanf("%d", &n) != EOF) {
if(n == ) break;
for (int i = ; i < ; i ++) {
scanf("%lf", &a[i]);
}
for (int i = ; i < ; i ++) {
scanf("%lf", &b[i]);
}
makemap(n);
gauss(all, all);
printf("%.2f\n", Atex[][all]);
}
return ;
}

sdutoj 2623 The number of steps的更多相关文章

  1. SDUT 2623 The number of steps (概率)

    The number of steps Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Mary stands in a stra ...

  2. SDUT 2623:The number of steps

    The number of steps Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Mary stands in a stra ...

  3. sdut2623--The number of steps(概率dp第一弹,求期望)

    The number of steps Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描写叙述 Mary stands in a st ...

  4. 13年山东省赛 The number of steps(概率dp水题)

    转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud The number of steps Time Limit: 1 Sec  Me ...

  5. [2013山东ACM]省赛 The number of steps (可能DP,数学期望)

    The number of steps nid=24#time" style="padding-bottom:0px; margin:0px; padding-left:0px; ...

  6. Minimum number of steps CodeForces - 805D(签到题)

    D. Minimum number of steps time limit per test 1 second memory limit per test 256 megabytes input st ...

  7. Codeforces Round #411 div 2 D. Minimum number of steps

    D. Minimum number of steps time limit per test 1 second memory limit per test 256 megabytes input st ...

  8. codeforce 804B Minimum number of steps

    cf劲啊 原题: We have a string of letters 'a' and 'b'. We want to perform some operations on it. On each ...

  9. Minimum number of steps 805D

    http://codeforces.com/contest/805/problem/D D. Minimum number of steps time limit per test 1 second ...

随机推荐

  1. nohup命令浅析

    要将一个命令放到后台执行,我们一般使用nohup sh command & &都知道是放到后台执行这个命令,那么nohup是做什么的? 这就要从unix的信号说起,unix的信号机制可 ...

  2. unix network programming volume1 sorce code build and get(UNIX網絡編程卷1第三版)

    source code下载地址:unpv13e.tar.gz下载 (也有放一份在google cloud storage) compile 1. ./configure 2. cd lib make ...

  3. js获取屏幕大小

    1.js获取屏幕大小 <html> <script> function a(){ document.write( "屏幕分辨率为:"+screen.widt ...

  4. jquery-uploadify 上传

    先从官网下载插件 http://www.uploadify.com/ 引入之后.... html.................... <!-- 上传 --> <div id=&q ...

  5. 常用JQ特效代码

    /** * hhBase 平台js * User: huanhuan * QQ: 651471385 * Email: th.wanghuan@gmail.com * 微博: huanhuan的天使 ...

  6. C/C++ 错误处理

    has incomplete type and cannot be defined在头文件中添加该类型所在的文件eg:aggregate 'std::stringstream oss' has inc ...

  7. Debug与Release的区别

    Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M).至于是否需要DLL支持,主要看你采用的编译选项.如果是基于ATL的,则Debug和Release版本对DLL的要求差 ...

  8. 在MySql 5.0 的表里同时添加两个自动更新的timestamp字段

    create table user_info (user_id int primary key auto_increment, register_time timestamp not null DEF ...

  9. [LintCode] Mini Twitter 迷你推特

    Implement a simple twitter. Support the following method: postTweet(user_id, tweet_text). Post a twe ...

  10. Jquery dialog属性

    修改标题: $('#test').dialog("option","title", "测试").dialog('open'); 修改位置: ...