ZOJ 2949 Coins of Luck(概率dp)

【链接】http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1948

【题意】有一个蛋疼的人打算用投硬币的方式决定吃A面还是B面,两种面各有n包,投一次硬币只吃一包,问到决定完为止投硬币次数的数学期望

【思路】

数学期望这个东西嘛,我的感觉就是【概率*值的加和】

比如各2包面,那么(2,2)的期望就要由(2,1)和(1,2)来组合,它们俩各1/2概率再乘各自期望后加一加,注意由于从(2,2)变换成它们还要用一个硬币,所以还要+1

因此这画成表格又是一个左边上边向我开炮的dp了……

dp[i][j] = 0.5 * dp[i][j-1] + 0.5 * dp[i-1][j] + 1dp[i][j]是状态(A面i包,B面j包)时的投硬币次数期望

再初始化下,1包对1包只用一个硬币,任何对0包都是0,over


【代码】

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <math.h>
#include <iostream>
#include <map>
#include <vector>
#include <set> 
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;

#define MAX_LEN 1005
#define ll long long 
#define mod 100000007

#define MEM(a,al) memset(a,al,sizeof(a))
#define sfx(x) scanf("%lf",&x)
#define sfxy(x,y) scanf("%lf%lf",&x,&y)
#define sdx(x) scanf("%d",&x)
#define sdxy(x,y) scanf("%d%d",&x,&y)
#define pfx(x) printf("%.0f\n",x)
#define pfxy(x,y) printf("%.6f %.6f\n",x,y)
#define pdx(x) printf("%d\n",x)
#define pdxy(x,y) printf("%d %d\n",x,y)
#define getArray(a,len) for(int ia = 0; ia < len; ia++) scanf("%d",&a[ia])
#define printArray(a,len) for(int ia = 0; ia < len; ia++) printf("%d%c",a[ia],(ia==len-1)?'\n':' ')
#define fora(i,n) for(i = 0; i < n; i++)
#define fora1(i,n) for(i = 1; i <= n; i++)
#define foraf(i,n) for(int i = 0; i < n; i++)
#define foraf1(i,n) for(int i = 1; i <= n; i++)
#define ford(i,n) for(i = n-1; i >= 0; i--)
#define ford1(i,n) for(i = n; i > 0; i--)
#define fordf(i,n) for(int i = n-1; i >= 0; i--)
#define fordf1(i,n) for(int i = n; i > 0; i--)

class WriteInfo{
public:
	void info() { printf("[Info] "); }
	void infoEnd() { printf(" [/Info]\n"); }
} W;

const int INF = 1<<29;
const double INFD = 1e20;
const double eps =  1e-6;

int n,m;
double dp[MAX_LEN][MAX_LEN];

int main() {
	int i,j,k;
	int T; 
	
	sdx(T);
	fora(i,1001) dp[0][i] = 0;
	fora(i,1001) dp[i][0] = 0;
	dp[1][1] = 1;
	fora1(i,1000)
		fora1(j,1000)
			dp[i][j] = 0.5 * dp[i][j-1] + 0.5 * dp[i-1][j] + 1;
	while(T--){
		sdx(n);
		printf("%.2f\n",dp[n][n]);
	}
	
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值