UVA 1541 - To Bet or Not To Bet(概率递推)

UVA 1541 - To Bet or Not To Bet

题目链接

题意:这题题意真是神了- -,看半天,大概是玩一个游戏,开始在位置0,终点在位置m + 1,每次扔一个硬币,正面走一步,反面走两步,走到的步上有4种情况:

1、向前走n步

2、向后走n步

3、停止一回合

4、无影响

问能在t次机会内,走到终点m + 1(如果跃过也算走到了)的概率,大于0.5,等于0.5,小于0.5对应不同输出

思路:题意懂了就好办了,其实就是递推就可以了dp[i][j]表示第i次机会,落在j步的概率,然后不断一步步去递推即可

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

const int INF = 0x3f3f3f3f;
const int N = 55;

int T, m, t, to[N];
double dp[N][N];

int tra() {
	char str[10];
	scanf("%s", str);
	if (str[0] == '0') return 0;
	if (str[0] == 'L') return INF;
	else {
		int num = 0, flag = (str[0] == '+' ? 1 : -1);
		for (int i = 1; str[i]; i++)
			num = num * 10 + str[i] - '0';
		return num * flag;
 	}
}

int main() {
	scanf("%d", &T);
	while (T--) {
		scanf("%d%d", &m, &t);
		for (int i = 1; i <= m; i++)
			to[i] = tra();
		to[m + 1] = 0;
   		memset(dp, 0, sizeof(dp));
   		dp[0][0] = 1;
   		for (int i = 0; i <= t; i++) {
   			for (int j = 0; j <= m; j++) {
   				if (to[min(m + 1, j + 1)] == INF)
   					dp[i + 2][min(m + 1, j + 1)] += dp[i][j] * 0.5;
 				else
 					dp[i + 1][min(max(0, j + 1 + to[min(m + 1, j + 1)]), m + 1)] += dp[i][j] * 0.5;
				if (to[min(m + 1, j + 2)] == INF)
   					dp[i + 2][min(m + 1, j + 2)] += dp[i][j] * 0.5;
 				else
 					dp[i + 1][min(max(0, j + 2 + to[min(m + 1, j + 2)]), m + 1)] += dp[i][j] * 0.5;
      		}
     	}
     	double ans = 0;
     	for (int i = 0; i <= t; i++) ans += dp[i][m + 1];
     	if (ans > 0.5) printf("Bet for. ");
     	else if (ans < 0.5) printf("Bet against. ");
     	else printf("Push. ");
     	printf("%.4lf\n", ans);
	}
	return 0;
}

UVA 1541 - To Bet or Not To Bet(概率递推)

时间: 2024-10-18 22:59:21

UVA 1541 - To Bet or Not To Bet(概率递推)的相关文章

UVA 11021 - Tribles(概率递推)

UVA 11021 - Tribles 题目链接 题意:k个毛球,每个毛球死后会产生i个毛球的概率为pi,问m天后,所有毛球都死亡的概率 思路:f[i]为一个毛球第i天死亡的概率,那么 f(i)=p0+p1f(i?1)+p2f(i?1)2+...+pnf(i?1)n 然后k个毛球利用乘法定理,答案为f(m)k 代码: #include <stdio.h> #include <string.h> #include <math.h> const int N = 1005;

Uva 10943 - How do you add ?( 组合数公式 + 递推 )

Uva 10943 - How do you add ?( 组合数公式 + 递推 ) 题意:给定一个数N,分解韡k个数,问有多少种组合.数可以重复 (N<=100) 分析:通过组合数学将题目抽象为 N个相同的小球,放入k个不同的盒子中,且允许盒子为空然后就可以用隔板法------> ANS = C(N+M-1,M-1)隔板法--> BD然后再根据组合数的性质可以进行递推(这题数据范围比较小)----> C(A,B) = C(A-1,B) + C(A-1,B-1);预处理一遍之后即可

UVA 10288 - Coupons(概率递推)

UVA 10288 - Coupons 题目链接 题意:n个张票,每张票取到概率等价,问连续取一定次数后,拥有所有的票的期望 思路:递推,f[i]表示还差i张票的时候期望,那么递推式为 f(i)=f(i)?(n?i)/n+f(i?1)?i/n+1 化简后递推即可,输出要输出分数比较麻烦 代码: #include <cstdio> #include <cstring> #include <cmath> long long gcd(long long a, long lon

UVA 11427 - Expect the Expected(概率递推期望)

UVA 11427 - Expect the Expected 题目链接 题意:玩一个游戏,赢的概率p,一个晚上能玩n盘,如果n盘都没赢到总赢的盘数比例大于等于p,以后都不再玩了,如果有到p就结束 思路:递推,dp[i][j]表示玩i盘,赢j盘的概率,那么一个晚上玩了n盘小于p的概率递推式为: dp(i,j)=dp(i?1,j)?(1?p)+dp(i?1,j?1)?p 总和为Q=dp(n,0)+dp(n,1)+...+dp(n,x)(x/n<p) 那么每个晚上失败的概率Q就求出来了,那么平均玩的

UVa 557 (概率 递推) Burger

题意: 有两种汉堡给2n个孩子吃,每个孩子在吃之前要抛硬币决定吃哪一种汉堡.如果只剩一种汉堡,就不用抛硬币了. 求最后两个孩子吃到同一种汉堡的概率. 分析: 可以从反面思考,求最后两个孩子吃到不同汉堡的概率. 因为最后两个汉堡是不同的,所以前面的2n-2个孩子吃汉堡之前一定都是要抛硬币的. 所以,吃两种汉堡的孩子人数相等,都是n-1个. 令,对于2n个孩子吃汉堡,所求概率为1 - f(n-1) 我们还可以递推f, 1 #include <iostream> 2 #include <cst

Uva 11021-Tribles(概率+递推)

题目链接:点击打开链接 题意:k只麻球,每活一天就会死亡,但第二天可能会生一些麻球,具体是 生i个麻球的概率为pi ,求m天后所有麻球都死亡的概率. 思路:考虑全概率公式,求k只麻球m天后全死亡 ,因为死亡是独立事件,应用乘法 ,ans= f[m] ^k ,f[m] 为一只麻球m天后均死亡的概率.对于第i天, f[i]=p0+p1*f[i-1]^1 +p2*f[i-1]^2 +...p(n-1)*f[i-1]^(n-1) (就是让i-1天所有的出生的麻球全部死亡,那么第i天麻球就没了..) 最终

UVA - 10288 Coupons (概率+递推)

Description Problem F Coupons Input: standard input Output: standard output Time Limit: 2 seconds Memory Limit: 32 MB Coupons in cereal boxes are numbered 1 to n, and a set of one of each is required for a prize (a cereal box, of course). With one co

UVa 11040 Add bricks in the wall (水题递推)

题意:给定一个金字塔,除了最后一行,每个数都等于支撑它的两个数的和,现在给奇数行的左数奇数位置,求整个金字塔. 析:很容易看出来,从下往上奇数行等于 a[i][j] = (a[i-2][j-1] - a[i][j-1] - a[i][j+1]) / 2;然后偶数行就推出来了. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string&

UVa 557 Burger (概率+递推)

题意:有 n 个牛肉堡和 n 个鸡肉堡给 2n 个客人吃,在吃之前抛硬币来决定吃什么,如果剩下的汉堡一样,就不用投了,求最后两个人吃到相同的概率. 析:由于正面考虑还要要不要投硬币,太麻烦,所以我们先求最后两人吃到不同的概率即可,再用 1 减去就OK. 假设最后两个人吃的不一样,那么前 n-2 个人吃的肯定是 n/2 -1个牛肉堡和n/2-1 个鸡肉堡,根据排列组合可知,概率应该是C(n-2, n/2-1) * (0.5)^(n-2). 这就是公式,然而这个并不好算,很可能超时,所以我们再把第