Wannafly挑战赛8 C :小C打比赛

题目传送门
状态压缩+概率DP

#include<bits/stdc++.h>
using namespace std;

double p[7][181];
double dp[1<<6][181];
int main(){

    int n,m;
    while(scanf("%d%d",&n,&m)==2){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++)
                scanf("%lf",&p[i][j]);
        }
        int maxs=1<<n;
        memset(dp,0,sizeof(dp));
        for(int i=1;i<maxs;i++){
            for(int j=1;j<=m;j++){
                for(int k=1;k<=n;k++){
                    if(i&(1<<(k-1))){
                        int s=i^(1<<(k-1));
                        double sum=0;
                        for(int l=1;l<=j;l++) sum+=(dp[s][j-l]+1)*p[k][l];
                        dp[i][j]=max(dp[i][j],sum);
                    }
                }
            }
        }
        printf("%.5f\n",dp[maxs-1][m]);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37960603/article/details/81363809