ZOJ 3502 Contest <状态压缩 概率 DP>

时间:2024-12-11 22:33:56

链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3502

 #include <iostream>
#include <cstdio>
#include <string>
#include <cmath>
#include <cstring>
using namespace std;
int T, N;
double p[][], dp[<<];
string s[<<];
const double eps=1e-;
int Sign( double x )
{
if( fabs(x)<eps )return ;
return x>?:-;
}
int main( )
{
scanf("%d", &T);
while(T--){
scanf("%d",&N );
for(int i=; i<N; ++ i){
for( int j=; j<N; ++j ){
scanf("%lf", &p[i][j]);
}
}
int t=<<N;double q; memset(dp, , sizeof dp);
if(N==)s[]="A"; // N=1 p=0 不能被更新到~
for(int i=; i<t; ++ i){
for( int j=; j<N; ++ j ){// 更新到当前位
if( i&(<<j)) {
q=;
for( int k=; k<N; ++ k ){ // 已经被更新过的
if(i&(<<k))
q=max(q, p[k][j]);
}
}
q=dp[i^(<<j)]+q/100.0;
if( Sign(q-dp[i])> || Sign(q-dp[i])== && s[i^(<<j)]<s[i]){
dp[i]=q;
s[i]=s[i^(<<j)];
s[i]+=('A'+j);
}
}
} printf("%.2f\n%s\n", dp[t-], s[t-].c_str());
}
return ;
}