poj3071——Football

本文通过使用概率+动态规划的方法解决了一种特定的竞赛问题。该问题中每轮比赛的结果都依赖于上一轮的结果,因此采用dp[i][j]来记录编号为j的选手到达第i轮的概率。通过迭代计算直至最后一轮,找出最终获胜概率最大的选手。

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

概率+dp.

每轮比赛都与上一轮的比赛有关系,所以考虑用dp[i][j]记录编号为j到达i轮的概率。

这道题真无语,调试时候,发现数据会突变,因为这个,这道题前后整了三天!到现在还是不解为何这样!

#include<iostream> #include<cstdio> #include<cstring> using namespace std; double date[130][130]; int n; bool vis[130]; int main() { int i,j,k,m; while(cin>>n) { if(n==-1) break; m=(1<<n); for(i=1;i<=m;i++) { for(j=1;j<=m;j++) { scanf("%lf",&date[i][j]); } } double dp[10][130]; memset(dp,0,sizeof(dp)); for(i=1;i<=m;i++) dp[0][i]=1.0; int w; for(i=1;i<=n;i++) { memset(vis,true,sizeof(vis)); int t=(1<<(i-1)); j=1; for(j=1;j<=m;j++) { w=j; while(vis[j]) { for(k=1;k<=t;k++) { int index=k+t+w-1; vis[index]=false; dp[i][j]+=dp[i-1][j]*date[j][index]*dp[i-1][index]; dp[i][index]+=dp[i-1][j]*date[index][j]*dp[i-1][index]; } j++; } } } int flag=0;double max=0; for(i=1;i<=m;i++) { if(max<dp[n][i]) { max=dp[n][i]; flag=i; } } cout<<flag<<endl; } return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值