概率dp习题

概率 d p dp dp习题

前言:太菜了,没学这个知识点,来补了,希望不咕咕咕。


1.D. Bag of mice

思路:板子题,求公主赢的概率,状态设为 d p [ i ] [ j ] dp[i][j] dp[i][j] i i i只白鼠, j j j只黑鼠,公主先手赢得概率。
首先初始化: d p [ i ] [ 0 ] = 1 , d p [ 0 ] [ j ] = 0 , i ∈ [ 1 , w ] , j ∈ [ 0 , b ] dp[i][0]=1,dp[0][j]=0,i\in[1,w],j\in[0,b] dp[i][0]=1,dp[0][j]=0,i[1,w],j[0,b]
然后状态转移:
分四种情况:
1.公主摸到白鼠, d p [ i ] [ j ] + = i i + j dp[i][j]+=\dfrac{i}{i+j} dp[i][j]+=i+ji
2.公主摸到黑鼠,龙摸到白鼠,直接输了,不用加。
3.公主摸到黑鼠,龙摸到黑鼠,且跑出一个黑鼠。
d p [ i ] [ j ] + = j i + j × j − 1 i + j − 1 × j − 2 i + j − 2 × d p [ i ] [ j − 3 ] dp[i][j]+=\dfrac{j}{i+j}\times \dfrac{j-1}{i+j-1} \times \dfrac{j-2}{i+j-2}\times dp[i][j-3] dp[i][j]+=i+jj×i+j1j1×i+j2j2×dp[i][j3]
4.公主摸到黑鼠,龙摸到黑鼠,且跑出一个白鼠。
d p [ i ] [ j ] + = j i + j × j − 1 i + j − 1 × i i + j − 2 × d p [ i − 1 ] [ j − 2 ] dp[i][j]+=\dfrac{j}{i+j}\times \dfrac{j-1}{i+j-1} \times \dfrac{i}{i+j-2}\times dp[i-1][j-2] dp[i][j]+=i+jj×i+j1j1×i+j2i×dp[i1][j2]

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
int w,b;
double dp[N][N]; 
int main(){
	scanf("%d%d",&w,&b);
	for(int i=0;i<=w;i++) dp[i][0]=1;
	for(int i=0;i<=b;i++) dp[0][i]=0;
	for(int i=1;i<=w;i++)
		for(int j=1;j<=b;j++){
			dp[i][j]+=(double)i/(i+j);
			if(j>=3){
				dp[i][j]+=(double)j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3];
			}
			if(j>=2){
				dp[i][j]+=(double)j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2]; 
			}
		}
	printf("%.9f\n",dp[w][b]);
	return 0;
}

2.ICPC模拟赛 D.Pokemon Ultra Sun

题意:两个宝可梦初始血量为 h p 1 , h p 2 hp_1,hp_2 hp1,hp2,第一个宝可梦每回合有 p p p的概率对第二个宝可梦造成 w w w伤害,有 ( 1 − p ) (1-p) (1p)的概率对自己造成 w w w伤害,求回合数的期望。
思路:令 d p [ i ] [ j ] dp[i][j] dp[i][j]表示第一个宝可梦血量为 i i i,第二个宝可梦血量为 j j j的回合数期望。
状态转移方程:
d p [ i ] [ j ] = p × ( d p [ i ] [ m a x ( 0 , j − w ) ] + 1 ) + ( 1 − p ) × ( d p [ m a x ( 0 , i − w ) ] [ j ] + 1 ) = 1 + p × d p [ i ] [ m a x ( 0 , j − w ) ] + ( 1 − p ) × d p [ m a x ( 0 , i − w ) ] [ j ] dp[i][j]\\=p\times (dp[i][max(0,j-w)]+1)+(1-p)\times (dp[max(0,i-w)][j]+1) \\=1+p\times dp[i][max(0,j-w)]+(1-p)\times dp[max(0,i-w)][j] dp[i][j]=p×(dp[i][max(0,jw)]+1)+(1p)×(dp[max(0,iw)][j]+1)=1+p×dp[i][max(0,jw)]+(1p)×dp[max(0,iw)][j]

初始状态: d p [ 0 ] [ 0 ] = d p [ i ] [ 0 ] = d p [ 0 ] [ i ] = 0 dp[0][0]=dp[i][0]=dp[0][i]=0 dp[0][0]=dp[i][0]=dp[0][i]=0

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=3e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
int T,h1,h2,w;
double p;
double dp[N][N];
int main(){
    cin>>T;
    while(T--){
        cin>>h1>>h2>>w>>p;mst(dp,0);
        for(int i=1;i<=h1;i++){
            for(int j=1;j<=h2;j++){
                dp[i][j]=1.0+p*dp[i][max(0,j-w)]+(1-p)*dp[max(0,i-w)][j];
            }
        }
        printf("%.6f\n",dp[h1][h2]);
    }
	return 0;
}

3.Crossing Rivers

题意:给定路径长为 D D D的路径 A B AB AB n n n条河,每条河左端距离 A A A p p p,长度为 L L L,每条河上有船,速度为 v v v,船的方向,位置随机。每条河不会相交且不会越界 A B AB AB,陆地上速度为 1 1 1,求从 A A A B B B的时间期望。

d p dp dp没关系,求期望问题,最坏情况是刚到河,船刚开走,时间为: 3 L v \dfrac{3L}{v} v3L,最好情况是刚到河,船刚开来,时间为: L v \dfrac{L}{v} vL

因为船的位置线性的,所以平均下来就是 2 L v \dfrac{2L}{v} v2L
然后求和即可,最后加上剩下走陆地的时间,就是总期望。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb push_back
int n,d;
int main(){
	int kase=0;
	while(scanf("%d%d",&n,&d)&&(n||d)){
		double ans=0;
		while(n--){
			int p,l;double v;
			cin>>p>>l>>v;
			ans+=2.0*l/v;
			d-=l;
		}
		ans+=d;
		printf("Case %d: %.3f\n\n",++kase,ans);
	}
	return 0;
}
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷酷的Herio

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值