リンク:
https://vjudge.net/problem/LightOJ-1030
質問の意味:
あなたは、洞窟の中で長い洞窟です!洞窟は、1×Nのグリッドで表すことができます。洞窟の各セルは金の任意の量を含むことができます。
最初は、あなたは今、それぞれあなたが完璧な6面ダイスを投げ回す位置1です。あなたが投げた後、サイコロでXを取得する場合、あなたはあなたの位置にXを追加し、新しい位置からのすべての金を集めます。あなたの新しい位置が洞窟の外にある場合は、適切な結果を得るまで、その後は再び投げ続けます。あなたはN番目の位置に到達すると、あなたの旅を停止します。今、あなたは洞窟についての情報を与えている、あなたが与えられた手順を使用して収集することができます金の予想数を見つける必要があります。
アイデア:
私は直接金を取るために、対応する開始点の観点から、所望の値から離れる点にDP [I] nが点を表します。
分を延長しながら、私は、確率点は、所望の計算に直接来ている(NI、6)フォワードポイント。
コード:
#include <iostream>
#include <memory.h>
#include <string>
#include <istream>
#include <sstream>
#include <vector>
#include <stack>
#include <algorithm>
#include <map>
#include <queue>
#include <math.h>
#include <cstdio>
#include <set>
#include <iterator>
#include <cstring>
#include <assert.h>
using namespace std;
typedef long long LL;
double Dp[110];
int a[110];
int n;
int main()
{
int t, cnt = 0;
scanf("%d",&t);
while (t--)
{
memset(Dp, 0, sizeof(Dp));
scanf("%d", &n);
for (int i = 1;i <= n;i++)
scanf("%d", &a[i]);
Dp[n] = a[n];
for (int i = n-1;i >= 1;i--)
{
Dp[i] += a[i];
int step = min(6, n-i);
for (int j = 1;j <= step;j++)
Dp[i] += (1.0/step)*Dp[i+j];
}
printf("Case %d: %.7lf\n", ++cnt, Dp[1]);
}
return 0;
}