算是挺简单的一道概率dp了,如果做了前面的聪聪于可可的话,这题不需要什么预处理,直接概率dp就行了。。。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <math.h>
#include <map>
#include <queue>
#include <sstream>
#include <iostream>
using namespace std;
#define INF 0x3fffffff
#define N 2020 double p[N][];
int n,a,b;
double dp[N][]; void dfs(int s,int k)
{
if(dp[s][k]>=) return ;
double tmp=;
if(k==)
{
double tp=;
for(int i=s+a;i<=s+b;i++)
{
if(i>n) //超出了界限
{
tmp+=tp;
break;
}
dfs(i,);
tmp += tp*p[i][]*(dp[i][]+); //选2的时候的概率
dfs(i,);
tmp += tp*p[i][]*(dp[i][]+);
tp*=(-p[i][]-p[i][]);
}
dp[s][k]=tmp;
}
else
{
if(k==)
{
double tp=;
for(int i=s+a;i<=s+b;i++)
{
if(i>n) //超出了界限
{
tmp+=tp;
break;
}
dfs(i,);
tmp+=tp*p[i][]*(dp[i][]+);
dfs(i,);
tmp+=tp*p[i][]*(dp[i][]+);
tp*=(-p[i][]-p[i][]);
}
dp[s][k]=tmp;
}
else
{
double tp=;
for(int i=s+a;i<=s+b;i++)
{
if(i>n) //超出了界限,
{
tmp+=tp;
break;
}
dfs(i,);
tmp+= tp*p[i][]*(dp[i][]+);
dfs(i,);
tmp+=tp*p[i][]*(dp[i][]+);
dfs(i,);
tmp+=tp*p[i][]*(dp[i][]+);
tp*=p[i][];
}
dp[s][k]=tmp;
}
}
} int main()
{
//freopen("//home//chen//Desktop//ACM//in.text","r",stdin);
//freopen("//home//chen//Desktop//ACM//out.text","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d%d",&n,&a,&b);
for(int i=;i<=n;i++)
{
for(int j=;j<=;j++)
scanf("%lf",&p[i][j]);
}
for(int i=;i<=n;i++)
for(int j=;j<=;j++)
dp[i][j]=-;
dfs(,);
printf("%.6lf\n",dp[][]);
}
return ;
}
05-11 11:28