概率DP POJ3071

概率DP POJ3071
 1 #include <iostream>

 2 #include <cstring>

 3 #include <cstdio>

 4 #include <algorithm>

 5 

 6 using namespace std;

 7 

 8 double p[300][300];

 9 double dp[10][300];

10 

11 int main()

12 {

13     int n;

14     while(scanf("%d", &n) != EOF)

15     {

16         if ( n == -1 ) break;

17         int m=1<<n;

18         for(int i=0;i<m;i++)

19             for(int t=0;t<m;t++)

20                 scanf("%lf",&p[i][t]);

21         for(int i=0;i<m;i++)

22             dp[0][i]=1.0;

23         for(int i=1;i<=n;i++)

24         {

25             for(int t=0;t<m;t++)

26             {

27                 dp[i][t]=0;

28                 for(int k=0;k<m;k++)

29                 {

30                     if(((t>>(i-1))^1)==(k>>(i-1)))

31                     {

32                         dp[i][t]+=dp[i-1][t]*dp[i-1][k]*p[t][k];

33                     }

34                 }

35             }

36         }

37         int ans=0;

38         for(int i=1;i<m;i++)

39         {

40             if(dp[n][i]>dp[n][ans])

41                 ans=i;

42         }

43         cout<<ans+1<<"\n";

44     }

45     return 0;

46 }
View Code

最后注意只能用"\n",用endl会刷新缓冲区,过不了

你可能感兴趣的:(poj)