题解:CF183D T-shirt
Unnamed114514 · · 题解
UPD 2025.4.22:修了一个唐爆了的锅。
Prob. link
首先考虑一个暴力 dp:
令
令
时间复杂度
考察
容易想到
根据期望的线性性,我们把它拆成每件衣服的贡献和后,贪心地取最大的
容易想到这样以后显然可以增加在一个颜色取的数量之后计算
总时间复杂度
#include<bits/stdc++.h>
#define int long long
#define double long double
#define endl '\n'
using namespace std;
const int N=3005,M=305;
int n,m;
double p[3005][305],f[2][M][N],delta[M],ans;
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;++i) for(int j=1,P;j<=m;++j) cin>>P,p[i][j]=P/1000.0;
for(int i=1;i<=m;++i){
f[0][i][0]=1;
for(int j=1;j<=n;++j) f[0][i][j]=f[0][i][j-1]*(1-p[j][i]);
delta[i]=1-f[0][i][n];
}
for(int i=1;i<=n;++i){
int pos=1;
for(int j=1;j<=m;++j) if(delta[j]>delta[pos]) pos=j;
ans+=delta[pos];
for(int j=1;j<=n;++j) f[1][pos][j]=f[1][pos][j-1]*(1-p[j][pos])+f[0][pos][j-1]*(p[j][pos]);
delta[pos]-=f[1][pos][n];
memcpy(f[0][pos],f[1][pos],sizeof(f[0][pos]));
}
cout<<fixed<<setprecision(10)<<ans<<endl;
return 0;
}