zoj3329(期望DP)
来源:互联网 发布:淘宝店铺价格怎么设置 编辑:程序博客网 时间:2024/04/30 16:16
题意:三个骰子,分别有k1,k2,k3个面,每次掷骰子,当分别为a,b,c是s回到0,否则s加上三个数字之和,s从0开始,当s大于n时结束,求掷骰子次数的期望。
解题思路:期望DP,从后往前推。dp[i]表示i到大于n的期望,dp[i] = p0*dp[0] + sum (pk*dp[i+k]) ,k为三个数字之和。接下来就是解这个方程了,这个方程有个特点,每次状态转移都会回到dp[0],而dp[0]正是我们要求的答案。一般解法:dp[i] = A[i]*dp[0] + B[i] , dp[i+k] = A[i+k]*dp[0] + B[i+k], 将上式带入状态转移方程,A[i] = po+sum(pk*A[i+k]),B[i] = sum(pk*B[i+k]) + 1 。求得A、B,dp[0] = A[0]*dp[0] + B[i]。
代码如下:
#include <stdio.h>#include <string.h>#include <algorithm>#include <map>#include <queue>#include <vector>#include <string>#include <iostream>#define N 1000using namespace std;double temp;int n,k1,k2,k3,a,b,c;double A[N],B[N];double dfs(int u,double C[],double z){ if(u > n) return 0; if(C[u] > 0) return C[u]; int i,j,k; for(i = 1; i <= k1; i++) for(j = 1; j <= k2; j++) for(k = 1; k <= k3; k++) { if(i == a && j == b && k == c) continue; C[u] += temp*dfs(u+i+j+k,C,z); } C[u] += z; return C[u];}int main(){ int t; scanf("%d",&t); while(t--) { scanf("%d%d%d%d%d%d%d",&n,&k1,&k2,&k3,&a,&b,&c); temp = 1.0/(k1*k2*k3); memset(A,0,sizeof(A)); memset(B,0,sizeof(B)); dfs(0,A,temp); dfs(0,B,1.0); printf("%.12lf\n",B[0]/(1-A[0])); } return 0;}
0 0
- zoj3329(期望DP)
- zoj3329(期望DP)
- zoj3329 概率dp求期望
- zoj3329 One Person Game(期望dp)
- zoj3329 期望
- ZOJ3329-One Person Game(概率DP求数学期望)
- zoj3329 One Person Game 概率dp求期望
- zoj3329 概率dp
- ZOJ3329 概率DP变形
- zoj3329(概率dp)
- ZOJ3329之经典概率DP
- ZOJ3329
- 【概率dp】zoj3329 One Person Game
- ZOJ3329 One Person Game 概率dp
- [ZOJ3329]One Person Game(概率dp)
- DP期望
- 期望DP
- 期望DP
- ubuntu14.04.1LTS安装NVIDIA Quadro NVS 135M等显卡驱动
- 织梦CMS游客不能匿名软件投稿的解决方法
- Git 2分钟指南
- 软件工程学习之流程
- OSI和TCP/IP的区别
- zoj3329(期望DP)
- Java 的String问题
- 蓝桥杯备战-逻辑判断
- Maven 目录结构的解析
- 网站发布—图解Win7旗舰版中的IIS配置asp.net运行环境(二)
- 【会议记录】小组第三次会议纪要
- Divide Two Integers
- 开源模拟器汇总
- 去掉织梦DedeCMS列表推荐时被加粗的方法