2013年8月17日

概率DP HDU 4586 play the dice

摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4586解题思路:只考虑第一次,获得的金币的平均值为sum/n.sum为所有色子的面的金币值相加。对于运气好,摇中了可以再来一次,该轮就能获得m/n*(sum/n)运气好,又再来一次,该轮能获得(m/n)^2*(sum/n)无穷无尽的摇下去,一共能获得sum/n*(1+p + p^2+`````+p^k + ````),其中p = m/n将式子化简,就能得到E = sum/(n-m)。所以当sum = 0时为0,n=m时为inf。其余就为sum/(n-m)。贴代码: 1 #include 2 int 阅读全文

posted @ 2013-08-17 21:44 allh123 阅读(330) 评论(0) 推荐(0) 编辑

水题 不要62 HDU 2089

摘要: 先预处理出所有的数是不是可能拿来用,我的想法是记录1-i这个区间内可用的数为s[i].输入a,b.答案就为s[b] - s[a-1].贴代码: 1 #include 2 #define N 1000010 3 int sum[N]; 4 bool check(int x) 5 { 6 while(x) 7 { 8 int t = x%10; 9 if(t == 4) return false;10 if( t == 2 && (x/10%10) == 6) return false;11 x /= 10;12 ... 阅读全文

posted @ 2013-08-17 21:09 allh123 阅读(115) 评论(0) 推荐(0) 编辑

抓老鼠 codeForce 148D - Bag of mice 概率DP

摘要: 设dp[i][j]为有白老鼠i只,黑老鼠j只时轮到公主取时,公主赢的概率。那么当i = 0 时,为0当j = 0时,为1公主可直接取出白老鼠一只赢的概率为i/(i+j)公主取出了黑老鼠,龙必然也要取出黑老鼠公主才能赢,跑出来的老鼠有两种可能跑出来的是黑老鼠,公主赢的概率为dp[i][j] += j/(i+j)*(j-1)/(i+j-1)*(j-2)/(i+j-2)*dp[i][j-3].(j>=3)跑出来的是白老鼠,公主赢的概率为dp[i][j] += j/(i+j)*(j-1)/(i+j-1)*i/(i+j-2)*dp[i-1][j-2].(j>=2)贴代码: 1 #includ 阅读全文

posted @ 2013-08-17 19:01 allh123 阅读(311) 评论(0) 推荐(0) 编辑

ZOJ 3551 吸血鬼 概率DP

摘要: 解题报告链接:http://www.cnblogs.com/183zyz/archive/2012/09/13/2683524.html做法:设当有i个吸血鬼时变成n个吸血鬼的天数的数学期望为dp[i].pi为人和吸血鬼相遇的概率,pi = i*(n-i)/cn2 . cn2表示从n个人中选两个人出来的选法,那么人和吸血鬼相遇的选法为i*(n-i).p为人变吸血鬼的概率。则有dp[i] = p*pi*(dp[i+1]+1)+(1-p*pi)(dp[i+1]+1)化为:dp[i] = dp[i+1] + 1/(p*pi)有dp[n] = 0;很容易得到dp[1] = sum(1/(p*pi)) 阅读全文

posted @ 2013-08-17 16:35 allh123 阅读(258) 评论(0) 推荐(0) 编辑

poj 2151 Check the difficulty of problems 概率DP

摘要: 解题链接:http://www.cnblogs.com/183zyz/archive/2012/09/13/2683524.html这题算是概率DP里的简单题,由于各种独立,所有设dp[i][j][k]为第i个队在做到第j个题时解了k个题的概率,针对第j个题,有解出和未解出两种可能。所以就会有dp[i][j][k] += dp[i][j-1][k-1]*p[i][j]; //解出dp[i][j][k] += dp[i][j-1][k]*(1-p[i][j]);//未解出然后题目要求算每个队至少解出一个且存在一个解出的题目数>=n 的概率设p1为每个队至少解出一个题的概率,p2为每个队解出 阅读全文

posted @ 2013-08-17 14:59 allh123 阅读(175) 评论(0) 推荐(0) 编辑

HDU 4681 string 求最长公共子序列的简单DP+暴力枚举

摘要: 先预处理,用求最长公共子序列的DP顺着处理一遍,再逆着处理一遍。再预处理串a和b中包含串c的子序列,当然,为了使这子序列尽可能短,会以c 串的第一个字符开始 ,c 串的最后一个字符结束将这些起始位置先记录下来,然后枚举这些位置,最大的值输出,看一下代码,你就会顿悟了····哈哈。贴代码: 1 #include 2 #include 3 #include 4 #define N 1005 5 using namespace std; 6 char a[2][N],b[N];//a[0]为串a,a[1]为串b,b为串c 7 int dp1[N][N],dp2 阅读全文

posted @ 2013-08-17 11:06 allh123 阅读(276) 评论(0) 推荐(0) 编辑

导航