HDU 4089

很容易列出方程

设dp[i][j]为排在第i位置,总共有j个人排队到达目标状态的概率

i=1

dp[i][j]=p4+p1*dp[i][j]+p2*dp[j][j]

2<=i<=k

dp[i][j]=p4+p1*dp[i][j]+p2*dp[i-1][j]+p3*dp[i-1][j-1]

i>k

dp[i][j]=p1*dp[i][j]+p2*dp[i-1][j]+p3*dp[i-1][j-1]

设p2=p2/(1-p1),p3=p3/(1-p1),p4=p4/(1-p4)

上述三个转移方程化简后为

dp[i][j]=p2*dp[i-1][j]+p3*dp[i-1][j-1]    i>k

dp[i][j]=p4+p2*dp[i-1][j]+p3*dp[i-1][j-1]  2<=i<=k

dp[i][j]=p4+p2*dp[j][j]   i==1

可以发现同一列的各状态存在一个环的依赖状态,于是,可以先求出dp[j][j]

不妨设dp[i][j]=A[i]*dp[j][j]+B[i]

不停地往上代入,即可得到最终dp[j][j]的表达式了

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

double p[2050][2050];
double A[2050],B[2050];

int main(){
	int n,m,k,k0,k1;
	double p1,p2,p3,p4;
	while(scanf("%d%d%d%lf%lf%lf%lf",&n,&m,&k,&p1,&p2,&p3,&p4)!=EOF){
		if(p4<1e-5){
			printf("0.00000\n");
			continue;
		}
	//	cout<<"YES"<<endl;
		p[1][1]=p4/(1-p1-p2);
		p2=p2/(1-p1); p3=p3/(1-p1); p4=p4/(1-p1);
		for(int j=2;j<=n;j++){
			for(int i=1;i<=j;i++){
				if(i==1){
					A[1]=p2; B[1]=p4;
				}
				else if(i>=2&&i<=k){
					A[i]=A[i-1]*p2;
					B[i]=p4+p3*p[i-1][j-1]+p2*B[i-1];
				}
				else{
					A[i]=p2*A[i-1];
					B[i]=p2*B[i-1]+p3*p[i-1][j-1];
				}
			}
			p[j][j]=B[j]/(1-A[j]);
			for(int i=1;i<=j-1;i++){
				if(i==1){
					p[1][j]=p4+p2*p[j][j];
				}
				else if(i>=2&&i<=k){
					p[i][j]=p4+p2*p[i-1][j]+p3*p[i-1][j-1];
				}
				else
				p[i][j]=p2*p[i-1][j]+p3*p[i-1][j-1];
			}
		}
		printf("%.5lf\n",p[m][n]);
	}
	return 0;
}

  

时间: 2024-08-03 03:30:44

HDU 4089的相关文章

hdu 4089 不错的DP 北京现场赛题

http://acm.hdu.edu.cn/showproblem.php?pid=4089 还有疑惑,需要重新推: 但是学到的: 1.A=a+b+c  abc是三种情况,那么P(A)=a*P(a->事件)+b*P(b->事件)+c*P(c->事件); a->事件意思是 在a情况下的事件,就是全概率公式的思想吧 2.一定注意每一步会不会出现分母为0 的情况,以及预处理的时候对于一些特殊情况导致自己的式子会出现分母为0的排除掉 3.概率DP经常出现推出了式子但是自己不会写代码的情况,

HDU 4089 Activation (概率dp 好题 + 难题)

Activation Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1842    Accepted Submission(s): 689 Problem Description After 4 years' waiting, the game "Chinese Paladin 5" finally comes out.

HDU 4089 &amp;&amp; UVa 1498 Activation 带环的概率DP

要在HDU上交的话,要用滚动数组优化一下空间. 这道题想了很久,也算是想明白了,就好好写一下吧. P1:激活游戏失败,再次尝试. P2:连接失服务器败,从队首排到队尾. P3:激活游戏成功,队首的人出队. P4:服务器down掉,所有人都不能激活了. 设d(i, j)表示i个人排队,主人公排在第j位,发生所求事件的概率. d(i, 1) = P1 d(i, 1) + P2 d(i, i) + P4 //分别对应激活失败,重新尝试:连接失败排到队尾:服务器down掉 特殊地可以直接计算出 d(1,

Activation(hdu 4089)

题目:仙5的激活序列.有以下4种情况: 1.注册失败,但是不影响队列顺序 ,概率为p1 2.连接失败,队首的人排到队尾,概率为p2 3.注册成功,队首离开队列,概率为p3 4.服务器崩溃,激活停止,概率为p4 求主角的位置在K以内,而且服务器崩溃的概率 /* dp[i][j]表示有i个人,主角在j这个位置最后满足要求的概率,dp[n][m]就是所求. 转移方程简单易懂 j==1: dp[i][1]=p1*dp[i][1]+p2*dp[i][i]+p4; 2<=j<=k: dp[i][j]=p1

hdu 4089 Activation (概率dp 手动消元)

Activation Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1562    Accepted Submission(s): 592 Problem Description After 4 years' waiting, the game "Chinese Paladin 5" finally comes out.

hdu 4089 概率dp

1 /* 2 题目大意:注册一款游戏需要排队,一共有四种事件: 3 1.注册失败,队列不变,概率为p1 4 2.注册过程中断开连接,正在注册的人排到队列的末尾,概率为p2 5 3.注册成功,移出队列,概率为p3 6 4.服务器暂停服务,概率为p4 7 求一个人他前面有不超过k-1个人的时候暂停服务的概率. 8 从前往后推,统计答案太麻烦,所以选择从后往前推. 9 dp(i,j)表示一共i个人,他排在j位置的达到目标状态的概率. 10 j==1 dp[i][j]=dp[i][j]*p1+dp[i]

ACM总结——dp专辑(转)

感谢博主——      http://blog.csdn.net/cc_again?viewmode=list       ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ***********************

【DP专辑】ACM动态规划总结

转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ******************

ACM 中的期望,概率 问题

一个简易的入门:点击打开链接 大神的总结:点击打开链接     zerolock 我搞的题目:点击打开链接 前段时间一直在做概率的题目. 一.期望 其中求解期望问题刚开始一直不理解.后来做得多了有感觉. 例:(有放回) 在5件产品有4件正品,1件次品,从中任取2件,记其中含正品的个数个数为随机变量ξ,则ξ的数学期望Eξ是 1.6 在5件产品有4件正品,1件次品,从中任取2件,记其中含正品的个数个数为随机变量ξ,则ξ=2时所取次数的数学期望是1.16 第一个例子是平常学的期望,做一件事情各个结果的