​题目传送门​​ 状态压缩+概率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]);
}
}