hdu4815 (概率DP)

本文介绍了一种使用概率动态规划解决策略游戏的方法,通过计算猴子得分的各种可能性,来确定老虎获胜所需达到的最低分数。文章给出了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于没有专门练过概率DP , 场上硬推的,由于一点小失误WA了两发 。

我们很容易求出来d[i][j],表示前i道题,得分为j的概率 。 这样,最终打完所有题目之后猴子得任意分数的概率我们就知道了,老虎要想赢就要至少得和他一样的分数,那么就很好办了,从0~max分,不断相加概率,当概率大于P时的分数就是答案 。

细节见代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 50;
const double INF = 10000000.0;
int T,n,a[maxn];
double p,d[50][40000+100];
int main() {
    scanf("%d",&T);
    while(T--) {
        scanf("%d%lf",&n,&p);
        ll sum = 0;
        for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sum += a[i]; }
        memset(d,0,sizeof(d));
        d[0][0] = 1.0;

        for(int i=1;i<=n;i++) {
            for(int j=0;j<=sum;j++) {
                if(j >= a[i]) d[i][j] += d[i-1][j-a[i]]/2;
                    
                d[i][j] += d[i-1][j]/2;
            }
        }
        int ans;
        double pp = 0.0;
        for(int i=0;i<=sum;i++) {
            pp += d[n][i];
            if(pp > p || fabs(pp-p) < 1e-6) { ans = i ; break; }
        }
        printf("%d\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值