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

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

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <string>

 4 #include <cmath>

 5 #include <cstring>

 6 using namespace std;

 7 int T, N;

 8 double p[15][15], dp[1<<15];

 9 string s[1<<15];

10 const double eps=1e-8;

11 int Sign( double x )

12 {

13     if( fabs(x)<eps )return 0;

14     return x>0?1:-1;

15 }

16 int main( )

17 {

18     scanf("%d", &T);

19     while(T--){

20         scanf("%d",&N );

21         for(int i=0; i<N; ++ i){

22             for( int j=0; j<N; ++j ){

23                 scanf("%lf", &p[i][j]);

24             }

25         }

26        int t=1<<N;double q;

27 

28         memset(dp, 0, sizeof dp);

29         if(N==1)s[1]="A"; // N=1 p=0 不能被更新到~

30         for(int i=1; i<t; ++ i){

31             for( int j=0; j<N; ++ j ){// 更新到当前位

32                 if( i&(1<<j)) {

33                     q=0;

34                     for( int k=0; k<N; ++ k ){ // 已经被更新过的

35                         if(i&(1<<k))

36                         q=max(q, p[k][j]);

37                     }

38                 }

39                 q=dp[i^(1<<j)]+q/100.0;

40                 if( Sign(q-dp[i])>0 || Sign(q-dp[i])==0 && s[i^(1<<j)]<s[i]){

41                     dp[i]=q;

42                     s[i]=s[i^(1<<j)];

43                     s[i]+=('A'+j);

44                 }

45             }

46         }

47 

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

49     }

50     return 0;

51 }
View Code

 

你可能感兴趣的:(test)