POJ 1217 FOUR QUARTERS

题目意思是,AB两个人掷硬币,每次一个人掷两次,然后对应图标里面得分,要你输出前20回合 A赢,B赢,或是平均的概率

dp还是不怎么会,参考别人代码才敲出来的

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<set>
 6 #include<vector>
 7 #include<map>
 8 #include<algorithm>
 9 #include<cmath>
10 #include<stdlib.h>
11 using namespace std;
12 double way[9]= {0.0625,0.125,0.0625,0.125,0.25,0.125,0.0625,0.125,0.0625};
13 int a[9]= {1,1,2,0,0,1,-1,0,0};
14 int b[9]= {0,-1,-1,1,0,0,2,0,-1};
15 double dp[22][66][66];
16 void solve()
17 {
18     memset(dp,0,sizeof(dp));
19     dp[0][20][20]=1;      //dp[i][j][k],表示第i个回合,A得j分,B得k分的概率,j或k最小为-20,所以+20
20     for(int i=1; i<=20; i++)
21         for(int j=60; j>=0; j--){
22             int score1=j-20;
23             for(int k=60; k>=0; k--){
24                 int score2=k-20;
25                 if(dp[i-1][j][k]>0){
26                     for(int s=0; s<9; s++)
27                         dp[i][score1+20+a[s]][score2+20+b[s] ]+=dp[i-1][j][k]*way[s];
28                 }
29 
30             }
31         }
32     printf("Round   A wins    B wins    Tie\n");
33     for(int i=1; i<=20; i++)
34     {
35         double a_win = 0 , b_win = 0 , tie = 0 ;
36         for(int j=0; j<=60; j++){
37             for(int k=0; k<=60; k++){
38                 if(j>k) a_win+=dp[i][j][k] ;
39                 else if(j<k)    b_win += dp[i][j][k] ;
40                 else tie += dp[i][j][k] ;
41             }
42         }
43         printf("%5d%10.4f%%%9.4f%%%9.4f%%\n",i,a_win*100,b_win*100,tie*100);
44     }
45 }
46 int main()
47 {
48     solve();
49 }

转载于:https://www.cnblogs.com/ainixu1314/p/3848787.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值