您的位置:首页 > 其它

UVA 11021 C - Tribles(概率DP)

2013-11-04 11:02 405 查看
记忆化就可以搞定,比赛里都没做出来,真的是态度有问题啊。。。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
double p[1001];
double dp[1001];
int flag[1001],n;
double po(double a,int k)
{
double b = 1.0;
while(k)
{
if(k&1)
b = a*b;
a = a*a;
k = k/2;
}
return b;
}
double dfs(int step)
{
int i;
if(flag[step])
return dp[step];
if(step == 1)
return p[0];
double ans = p[0],temp;
for(i = 1;i < n;i ++)
{
temp = p[i];
temp *= po(dfs(step-1),i);
ans += temp;
}
flag[step] = 1;
return dp[step] = ans;
}
int main()
{
int t,cas = 1,i,m,k;
double ans,temp;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&n,&k,&m);
memset(flag,0,sizeof(flag));
for(i = 0;i < n;i ++)
scanf("%lf",&p[i]);
if(m == 0)
{
printf("Case #%d: %.7lf\n",cas++,0.0);
continue;
}
ans = 1;
temp = dfs(m);
for(i = 0;i < k;i ++)
ans *= temp;
printf("Case #%d: %.7lf\n",cas++,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: