题意不说了;
大概思路 :求出到达每一行的概率,求出每一行的可以获得的val期望,然后分别对应相乘求和就是了;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define N 100007
double hang[516];
double dp[514];
double down[13];
double hangval[504][25],hangrate[504][24];
double sum[13];
int main()
{
int t,_case = 1,i,j;
int n,m,k,Q;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d%d",&n,&k);
for(i=1;i<=k;i++)
scanf("%lf",&down[i]);
for(i=1;i<=n;i++)
{
scanf("%d",&Q);
hang[i] = 0.0;
for(j=1;j<=Q;j++)
{
scanf("%lf%lf",&hangval[i][j],&hangrate[i][j]);
hang[i] += hangval[i][j]*hangrate[i][j];
}
}
dp[1] = 1;
for(i=2;i<=n;i++)
{
for(j=1;j<=k;j++)
{
if(i>=j+1)
dp[i] += dp[i-j]*down[j];
}
}
double ans = 0;
for(i=1;i<=n;i++)
ans+= dp[i]*hang[i];
printf("Case #%d: %.6lf\n",_case++,ans);
}
return 0;
}