題意:唔……這是適合男女獨處一室時玩的……緊張又刺激的飛行棋。就是飛行棋的規則,n個點,一個六面的骰子,一開始在1這個位置,每個位置都有一個價值,問你走到最後一個點取得的價值的期望是多少。
分析:我們可以算出來走每個位置的概率,用這個位置的價值乘以概率,加起來就是期望了。對於一每個點,都可以從在他前面和它的距離<= 6的點轉移過來,但是要考慮到,最後面幾個點在轉移的時候不是乘1/6。
#include<cstdio>
#include<cstring>
using namespace std;
double a[1000];
int c[1000];
int main(){
int T, n, kase = 0;
scanf("%d", &T);
while(T--){
double ans = 0;
memset(a, 0, sizeof(a));
memset(c, 0, sizeof(c));
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", &c[i]);
}
a[1] = a[n] = 1;
ans = c[1];
if(n != 1) ans += c[n];
for(int i = 2; i < n; i++){
for(int j = i - 6 < 1 ? 1 : i - 6; j <= i - 1; j++){
if(n - j >= 6){
a[i] += a[j] * 1.0/6;
}else{
a[i] += a[j] * 1.0/(n - j);
}
}
ans += (double) c[i] * a[i];
}
printf("Case %d: %lf\n", ++kase, ans);
}
return 0;
}