//poj 3071 Football(概率动态规划)
/*============================
^ | 0 1 2 3 4 5 6 7
----------------------------
0 | 0 1 2 3 4 5 6 7
1 | 1 0 3 2 5 4 7 6
2 | 2 3 0 1 6 7 4 5
3 | 3 2 1 0 7 6 5 4
4 | 4 5 6 7 0 1 2 3
5 | 5 4 7 6 1 0 3 2
6 | 6 7 4 5 2 3 0 1
7 | 7 6 5 4 3 2 1 0
对于^运算可以很好的运用到全概率公式
=============================*/
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int N=130;
double p[N][N];
double dp[N][8];
int main()
{
int n,i,j;
while(scanf("%d",&n)==1)
{
if(n==-1) break;
int m=(1<<n);
for(i=0;i<m;i++)
{
for(j=0;j<m;j++)
{
scanf("%lf",&p[i][j]);
}
dp[i][0]=1;
}
int ans=0;
for(i=0;i<n;i++)
{
ans=0;
for(j=0;j<m;j++)
{
double sum=0;
//==========全概率算法===============
for(int k=(1<<i);k<(1<<(i+1));k++)
{
sum+=dp[k^j][i]*p[j][k^j];
}
dp[j][i+1]=dp[j][i]*sum;
//==========================
if(dp[j][i+1]>dp[ans][i+1])
{
ans=j;
}
}
}
printf("%d\n",ans+1);
}
return 0;
}
poj 3071 Football(概率动态规划)
最新推荐文章于 2018-03-19 08:09:00 发布