LightOJ - 1030 Discovering Gold 期望
2015-06-04 15:06
399 查看
题目大意:在一个1*N的格子里,每个格子都有相应的金币数,走到相应格子的话,就会得到该格子的金币。
现在有一个人在1这个位置,手里有一颗色子,色子摇到几,他就前进几步,但有一种情况例外,如果当前位置+色子数 > N,那么他就会重新摇色子。
走到N这个位置的话,意味着游戏结束了。
问游戏结束时,这个人得到金币的期望。
解题思路:这题要倒着推,由N推向1
设dp[k]为到达k这个位置时得到金币的期望,m为该点和N这个位置的距离,gold[k]为k这个位置的金币数,因为走的位置不能超过N,所以要取min(m,6)
那么dp[k] = 1 / min(m,6) * (dp[k + 1] + dp[k+2] + … + dp[min(m,6)]) + gold[k]
现在有一个人在1这个位置,手里有一颗色子,色子摇到几,他就前进几步,但有一种情况例外,如果当前位置+色子数 > N,那么他就会重新摇色子。
走到N这个位置的话,意味着游戏结束了。
问游戏结束时,这个人得到金币的期望。
解题思路:这题要倒着推,由N推向1
设dp[k]为到达k这个位置时得到金币的期望,m为该点和N这个位置的距离,gold[k]为k这个位置的金币数,因为走的位置不能超过N,所以要取min(m,6)
那么dp[k] = 1 / min(m,6) * (dp[k + 1] + dp[k+2] + … + dp[min(m,6)]) + gold[k]
[code]#include<cstdio> #include<cmath> #include<algorithm> using namespace std; using namespace std; const int N = 110; int gold ; double dp ; int n; double solve() { for(int i = 0; i < n - 1; i++) dp[i] = 0; int step; dp[n-1] = gold[n-1]; for(int i = n - 2; i >= 0; i--) { dp[i] = gold[i]; step = min(6, n-1-i); for(int j = 1; j <= step; j++) dp[i] += 1.0 / step * dp[i+j]; } return dp[0]; } int main() { int test, cas = 1; scanf("%d", &test); while(test--) { scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &gold[i]); printf("Case %d: %.7lf\n", cas++, solve()); } return 0; }
相关文章推荐
- django 聚合函数
- Django使用总结
- Algorithm --> 动态规划
- 从零搭建mongo分片集群的简洁方法
- mgo 驱动新加重连
- Google收购传感器公司Lumedyne
- mongo与hbase区别
- django 自带过滤器
- 百度地图经纬度 转换到 腾讯地图/Google地图 对应经纬度
- google pay 支付踩过的坑
- go 语言资料参考
- go学习笔记:2.变量、类型、常量
- Go语言3-程序控制
- 拟牛顿法/Quasi-Newton,DFP算法/Davidon-Fletcher-Powell,及BFGS算法/Broyden-Fletcher-Goldfarb-Shanno
- OC基础学习——Block语法的学习和Category与Extension的初步认识
- Django. No changes detected when "makemigrations"
- golang web开发获取get、post、cookie参数
- Django学习(六) 模板
- golang学习(二)
- gRPC的简单Go例子