简单的概率DP。因为输入顺序反了,。错了N次。,,
代码如下:
- #include <iostream>
- #include <string.h>
- #include <math.h>
- #include <queue>
- #include <algorithm>
- #include <stdlib.h>
- #include <map>
- #include <set>
- #include <stdio.h>
- using namespace std;
- #define LL __int64
- #define pi acos(-1.0)
- const int mod=100000000;
- const int INF=0x3f3f3f3f;
- const double eqs=1e-8;
- double dp[2001][2001];
- int main()
- {
- int hp1,hp2,i,j;
- double a[8],b[8],w1,w2,tmp,p;
- while(scanf("%d%d",&hp2,&hp1)!=EOF) {
- for(i=0; i<6; i++) {
- scanf("%lf",&a[i]);
- }
- for(i=0; i<6; i++) {
- scanf("%lf",&b[i]);
- }
- w1=w2=0;
- for(i=1; i<6; i++) {
- for(j=0; j<i; j++) {
- w1+=a[i]*b[j];
- w2+=b[i]*a[j];
- }
- }
- p=w1+w2;
- if(p) {
- w1/=p;
- w2/=p;
- }
- for(i=hp1; i>0; i--) {
- for(j=hp2; j>=0; j--) {
- if(i==hp1&&j==hp2) {
- dp[i][j]=1;
- } else if(i==hp1) {
- dp[i][j]=dp[i][j+1]*w1;
- } else if(j==hp2) {
- dp[i][j]=dp[i+1][j]*w2;
- } else if(!j) {
- dp[i][j]=dp[i][j+1]*w1;
- } else {
- dp[i][j]=dp[i+1][j]*w2+dp[i][j+1]*w1;
- }
- }
- }
- double ans=0;
- for(i=1; i<=hp1; i++) {
- ans+=dp[i][0];
- }
- printf("%.6f\n",ans);
- }
- return 0;
- }