您的位置:首页 > 其它

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

2013-08-12 14:45 169 查看
链接: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[15][15], dp[1<<15];
string s[1<<15];
const double eps=1e-8;
int Sign( double x )
{
if( fabs(x)<eps )return 0;
return x>0?1:-1;
}
int main( )
{
scanf("%d", &T);
while(T--){
scanf("%d",&N );
for(int i=0; i<N; ++ i){
for( int j=0; j<N; ++j ){
scanf("%lf", &p[i][j]);
}
}
int t=1<<N;double q;

memset(dp, 0, sizeof dp);
if(N==1)s[1]="A"; // N=1 p=0 不能被更新到~
for(int i=1; i<t; ++ i){
for( int j=0; j<N; ++ j ){// 更新到当前位
if( i&(1<<j)) {
q=0;
for( int k=0; k<N; ++ k ){ // 已经被更新过的
if(i&(1<<k))
q=max(q, p[k][j]);
}
}
q=dp[i^(1<<j)]+q/100.0;
if( Sign(q-dp[i])>0 || Sign(q-dp[i])==0 && s[i^(1<<j)]<s[i]){
dp[i]=q;
s[i]=s[i^(1<<j)];
s[i]+=('A'+j);
}
}
}

printf("%.2f\n%s\n", dp[t-1], s[t-1].c_str());
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: