HDU 4089 Activation:概率dp + 迭代【手动消元】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4089
题意:
有n个人在排队激活游戏,Tomato排在第m个。
每次队列中的第一个人去激活游戏,有可能发生以下四种情况:
(1)激活失败,继续留在队首,等待下一次激活。
(2)连接失败,退到队尾。
(3)激活成功,离开队列。
(4)服务器瘫痪。
发生的概率分别为p1,p2,p3,p4。
问你服务器瘫痪时,Tomato的位置<=k的概率。
题解:
表示状态:
dp[i][j] = probability
表示当前还有i个人在排队,Tomato在位置j。在这以及之后服务器瘫痪时,Tomato位置<=k的概率。
找出答案:
ans = dp[n][m]
如何转移:
按着四种情况分别写就好:
(1)j == 1: dp[i][1] = dp[i][1]*p1 + dp[i][i]*p2 + p4
(2)2<=j<=k: dp[i][j] = dp[i][j]*p1 + dp[i][j-1]*p2 + dp[i-1][j-1]*p3 + p4
(3)k<j<=i: dp[i][j] = dp[i][j]*p1 + dp[i][j-1]*p2 + dp[i-1][j-1]*p3
令p21 = p2/(1-p1), p31 = p3/(1-p1), p41 = p4/(1-p1)
化简得:
(1)j == 1: dp[i][1] = dp[i][i]*p21 + p41
(2)2<=j<=k: dp[i][j] = dp[i][j-1]*p21 + dp[i-1][j-1]*p31 + p41
(3)k<j<=i: dp[i][j] = dp[i][j-1]*p21 + dp[i-1][j-1]*p31
边界条件:
dp[1][1] = dp[1][1]*(p1+p2) + p4
解得:dp[1][1] = p4/(1-p1-p2)
然而这并没有结束……
转移的时候显然先枚举i,在枚举j。
可是j在当前的i中,是往两个方向转移的:
dp[i][j]需要用到前面的dp[i][j-1],而dp[i][1]又用到了后面的dp[i][i]……QAQ
所以迭代一下,先解出dp[i][1]:
每一个dp[i][j]都可以表示成 dp[i][j] = p*dp[i][1] + c 的形式。
显然对于最初的dp[i][1]: p = 1, c = 0
对于后面的每一个dp[i][j]: p *= p21, c = c*p21 + dp[i-1][j-1]*p31 + (j<=k)*p41
这样就由前一项的p和c,推出了当前的p和c。
推啊推,直到推出了:dp[i][i] = p*dp[i][1] + c
这时就可以代入解方程了:
代入原来的递推式dp[i][1] = dp[i][i]*p21 + p41中
得到:dp[i][1] = p21*(p*dp[i][1] + c) + p41
解得:dp[i][1] = (p21*c + p41)/(1 - p*p21)
然而还是没有结束……
这题丧病卡空间……所以用滚动数组。
由于转移的时候要用到dp[0][j]的0值,所以第一维MAX_N变成3,i=1,2轮流使用。
这样就好啦~~~
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_N 2005
#define cal(x) ((!(x))?0:(2-((x)&1))) using namespace std; int n,m,k;
double p1,p2,p3,p4;
double dp[][MAX_N]; int main()
{
memset(dp,,sizeof(dp));
while(scanf("%d%d%d%lf%lf%lf%lf",&n,&m,&k,&p1,&p2,&p3,&p4)!=EOF)
{
if(p4<1e-)
{
printf("0.00000\n");
continue;
}
double p21=p2/(-p1);
double p31=p3/(-p1);
double p41=p4/(-p1);
dp[cal()][]=p4/(-p1-p2);
for(int i=;i<=n;i++)
{
if(i>)
{
double p=1.0,c=;
for(int j=;j<=i;j++)
{
p*=p21;
c=c*p21+dp[cal(i-)][j-]*p31;
if(j<=k) c+=p41;
}
dp[cal(i)][]=(c*p21+p41)/(-p*p21);
}
for(int j=;j<=i;j++)
{
dp[cal(i)][j]=dp[cal(i)][j-]*p21+dp[cal(i-)][j-]*p31;
if(j<=k) dp[cal(i)][j]+=p41;
}
}
printf("%.5f\n",dp[cal(n)][m]);
}
}
HDU 4089 Activation:概率dp + 迭代【手动消元】的更多相关文章
- [HDU 4089]Activation[概率DP]
题意: 有n个人排队等着在官网上激活游戏.Tomato排在第m个. 对于队列中的第一个人.有以下情况: 1.激活失败,留在队列中等待下一次激活(概率为p1) 2.失去连接,出队列,然后排在队列的最后( ...
- HDU 4089 Activation 概率DP 难度:3
http://acm.hdu.edu.cn/showproblem.php?pid=4089 这道题中一共有两个循环: 1.事件1 如果一直落在Activation failed事件上,那么就会重新继 ...
- 【BZOJ 2337】 2337: [HNOI2011]XOR和路径(概率DP、高斯消元)
2337: [HNOI2011]XOR和路径 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1170 Solved: 683 Description ...
- BZOJ2707 [SDOI2012]走迷宫 【概率dp + tarjan + 高斯消元】
题目 Morenan被困在了一个迷宫里.迷宫可以视为N个点M条边的有向图,其中Morenan处于起点S,迷宫的终点设为T.可惜的是,Morenan非常的脑小,他只会从一个点出发随机沿着一条从该点出发的 ...
- hdu4418(概率dp + 高斯消元)
应该是一个入门级别的题目. 但是有几个坑点. 1. 只选择x能到达的点作为guass中的未知数. 2. m可能大于n,所以在构建方程组时未知数的系数不能直接等于,要+= 3.题意貌似说的有问题,D为- ...
- Activation HDU - 4089(概率dp)
After 4 years' waiting, the game "Chinese Paladin 5" finally comes out. Tomato is a crazy ...
- Activation HDU - 4089 (概率DP)
kuangbin的博客 强 #include <bits/stdc++.h> using namespace std; const int MAXN = 2005; const doubl ...
- HDU 4089 Activation(概率DP)(转)
11年北京现场赛的题目.概率DP. 公式化简起来比较困难....而且就算结果做出来了,没有考虑特殊情况照样会WA到死的.... 去参加区域赛一定要考虑到各种情况. 像概率dp,公式推出来就很容易写 ...
- HDU 4418 Time travel 期望dp+dfs+高斯消元
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4418 Time travel Time Limit: 2000/1000 MS (Java/Othe ...
- HDU 3853LOOPS(简单概率DP)
HDU 3853 LOOPS 题目大意是说人现在在1,1,需要走到N,N,每次有p1的可能在元位置不变,p2的可能走到右边一格,有p3的可能走到下面一格,问从起点走到终点的期望值 这是弱菜做的第 ...
随机推荐
- eclipse编写scala应用运行在spark集群上
代码 package spark_1 import org.apache.spark.SparkConf import org.apache.spark.SparkContext class Work ...
- iOS 解决TableView reloadData时cell中图片会闪的问题
tableView调用reloaddata的时候发现有个小问题,每次刷新图片都会抖动闪烁一下,看着很难受,也影响体验.造成这个问题的主要原因是因为刷新时候切换图片导致.要解决这个问题也很好解决,使用S ...
- Quartz.Net - Lesson2: 任务和触发器
Lesson 2: 任务和触发器 本系列文章是官方3.x文档的翻译,原文地址:https://www.quartz-scheduler.net/documentation/quartz-3.x/tut ...
- 解密SVM系列(二):SVM的理论基础(转载)
解密SVM系列(二):SVM的理论基础 原文博主讲解地太好了 收藏下 解密SVM系列(三):SMO算法原理与实战求解 支持向量机通俗导论(理解SVM的三层境界) 上节我们探讨了关于拉格朗日乘 ...
- Web性能测试工具:http_load安装&使用简介
除了siege,在Web性能测试工具中,http_load也是比较热门和常见的一款,有时因为种种原因,只能使用现成的工具,所以多了解和掌握一种Web性能测试工具是很有必要的. 1.下载安装包 略过 2 ...
- 动态对象创建(二)重载new和delete
动态对象创建(二)重载new和delete 前言 上文我简单介绍了一下动态对象创建的方法,这一篇文章的内容主要是对重载new和delete做一些讲解,也希望能够得到博友们的指点,在这里谢过大家. 通常 ...
- @media screen 针对不同移动设备——响应式设计
概念: device-pixel-ratio:定义输入设备屏幕的可视宽度与可见高度比率. device-width:输入设备屏幕的可视宽度. orientation :屏幕横竖屏定向.landscap ...
- Linq实现between拓展
先写一个拓展方法 static class Ext { public static IQueryable<TSource> Between<TSource, TKey> (th ...
- jedisLock—redis分布式锁实现(转)
一.使用分布式锁要满足的几个条件: 系统是一个分布式系统(关键是分布式,单机的可以使用ReentrantLock或者synchronized代码块来实现) 共享资源(各个系统访问同一个资源,资源的载体 ...
- 数据库存储I/O类型分析与配置
存储设备作为数据的容器,为应用提供数据存取服务,而存储系统将数据展现给不同的应用后,应用程序对数据访问不尽相同.简要来说,就是读和写,更加细分的话是以不同的传输单元(I/O大小)进行顺序和随机类型的读 ...