LightOJ 1265 Island of Survival (概率dp)

题意:一个岛上有你,t头老虎,d头鹿,每天都有两种生物见面:
(1)你和老虎见面,你死翘翘。
(2)鹿和老虎见面,鹿死翘翘。
(3)老虎和老虎见面,都死翘翘。
(4)鹿和鹿见面,相安无事。
(5)你和鹿见面,杀不杀鹿取决于你。
直到有一天你可以保证自己不会死,输出得到这个结果的期望概率。

题解:概率dp
奇数个老虎,必死的局,考虑偶数,让老虎碰上自己概率最小,不杀鹿。
d p [ i ] dp[i] dp[i]表示剩 i i i头老虎时还没死的概率。
因为与鹿无关,不考虑鹿。
总事件=虎遇到虎+虎遇到你 i ∗ ( i − 1 ) / 2 + i i * (i - 1) / 2+i i(i1)/2+i
没死事件=虎遇到虎 i ∗ ( i − 1 ) / 2 i * (i - 1) / 2 i(i1)/2
d p [ i ] + = d p [ i + 2 ] ∗ dp[i]+=dp[i+2]* dp[i]+=dp[i+2]没死/总, d p [ t ] = 1 dp[t]=1 dp[t]=1

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<fstream>
#include<set>
#include<map>
#include<sstream>
#include<iomanip>
#define ll long long
using namespace std;
int t, a, b, n;
double dp[1111];
int main() {
	scanf("%d", &t);
	int cas = 0;
	while (t--) {
		scanf("%d%d", &a, &b);
		memset(dp, 0, sizeof(dp));
		dp[a] = 1;
		if (a & 1) printf("Case %d: %d\n", ++cas, 0);
		else {
			for (int i = a; i >= 2; i -= 2) {
				dp[i - 2] += dp[i] * (i * (i - 1) / 2) / (i * (i - 1) / 2 + i);
			}
			printf("Case %d: %f\n", ++cas, dp[0]);
		}
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值