概率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 }
最后注意只能用"\n",用endl会刷新缓冲区,过不了