hdu 4800 Josephina and RPG

本文探讨了在面对多种阵容组合时,如何通过动态规划算法制定最优策略来连续击败多个对手。

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

        题意:给出C(M,3)种阵容,和每种阵容间的胜率,你需要连续打败n个阵容。开始时你的阵容任选,打赢之后可以换成对方的阵容,求打败n个阵容的概率。

        思路:dp。dp(i,j)表示前当前打第i场,使用第j套阵容的最大胜率。状态转移很简单,要么换阵容,要么不换。


#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
#include<algorithm>
#include<string.h>
#include<cstdio>

using namespace std;

#define ll long long

double T[222][222];
int ai[10010];
double dp[10010][222];

int n;
int r;

int main(){
    int  m;
    while(cin>>m){
        r=m*(m-1)*(m-2)/6;

        for(int i=0;i<r;i++){
            for(int j=0;j<r;j++){
                scanf("%lf",&T[i][j]);
            }
        }

        cin>>n;

        for(int i=1;i<=n;i++)scanf("%d",&ai[i]);
        for(int i=0;i<r;i++)dp[0][i]=1.0;

        for(int i=1;i<=n;i++){
            for(int j=0;j<r;j++){
                dp[i][j]=dp[i-1][j]*T[j][ai[i]];
            }
            for(int j=0;j<r;j++){
                dp[i][ai[i-1]]=max(dp[i][ai[i-1]],dp[i-1][j]*T[ai[i-1]][ai[i]]);
            }
        }

        double ans=0;
        for(int i=0;i<r;i++){
            ans=max(ans,dp[n][i]);
        }
        printf("%.6lf\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值