ZOJ 3735 Josephina and RPG (概率dp)

题意:给你一个n,然后给你C(n,3)个队伍, 给你每个队伍之间的胜率。 接下来给你m个队伍,让你依次跟他们比赛,开始你能选择任意的队伍,如果你打赢了一支队伍,你可以选择换成输给你的这个队伍或者不换,你能随便选队伍,求完胜的最大概率(初始队伍让你随便选)。 

ma[i][j] 是存i赢j的概率。a[i]表示第i个队伍号

思路:我们开个二维dp【i】【j】表示赢得前i个队伍后且当前的队伍是j的最大胜率。不换就正常求赢的最大概率,dp[i][j] = dp[i-1][j]*ma[i][j],等求过一遍后,换的情况是dp【i】【a[i]】 = max(dp【i】【k) k属于1~C(n,3);

 

#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;

double dp[N][200], ma[200][200];
int main()
{
    int n;
    while( cin >> n){
        int len = n*(n-1)*(n-2)/6;
        for(int i = 1; i <= len; i++){
            dp[0][i] = 1;  //初始化
            for(int j = 1; j <= len; j++)
                cin >> ma[i][j];
        }
        cin >> n; double x;
        for(int i = 1; i <= n; i++){
            int pos; cin >> pos; pos++; x = 0;
            for(int j = 1; j <= len; j++){
                dp[i][j] = dp[i-1][j] * ma[j][pos];
                x = max(x, dp[i][j]);
            }
            dp[i][pos] = x;
        }
        printf("%.6lf\n",x);
    }
    return 0;
}

 

posted @ 2019-08-09 17:31  philo_zhou  阅读(153)  评论(0)    收藏  举报