LightOJ 1030 ?Discovering Gold
题意
从左到右有nnn个方格,每一块方格上有xix_ixi?块黄金,最初站在第一块方格上,有一个666个面的均匀骰子,每一个面上的权值是1?61-61?6,每次掷骰子之后按照点数yyy跳到yyy步之后的方格,如果超出范围,则重新掷骰子,问到达第n个方格能得到的期望黄金数。
做法
从后往前求期望,设dp[i]
为i
点到达n
能获得的期望黄金数,那么首先dp[n]=x[n]
,之后每个方格的dp
值就是所有他能到达的方格的dp
值的平均值加上当前点的黄金数,最后dp[1]
就是答案。
代码
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5+5;
double a[maxn];
int main()
{
int t;int tt=0;scanf("%d",&t);while(t--){
int n;scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%lf",&a[i]);for(int i=n-1;i>=1;i--){
double tmp=0.0;int cnt=0;for(int j=1;j<=6;j++){
if(i+j<=n){
cnt++;tmp+=a[i+j];}}a[i]+=tmp/cnt;}printf("Case %d: %.10f\n",++tt,a[1]);}return 0;
}