您的位置:首页 > 其它

poj 3071 Football 概率DP

2013-08-02 20:08 507 查看
概率DP,递推式:dp[i][j]=sigma(dp[i-1][j]*p[j][k]*dp[i-1][k])

再就是判断j和k是否相邻:if(((k>>(i-1))^1)==(j>>(i-1)))

代码如下:

#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
using namespace std;
double dp[129][129],p[129][129];
int main()
{
int i,j,k,ans,n;
while(cin>>n){
if(n==-1) break;
for(i=0;i<(1<<n);i++)
for(j=0;j<(1<<n);j++){
cin>>p[i][j];
}
memset(dp,0,sizeof(dp));
for(i=0;i<(1<<n);i++) dp[0][i]=1;
for(i=1;i<=n;i++)
for(j=0;j<(1<<n);j++)
for(k=0;k<(1<<n);k++){
if(((k>>(i-1))^1)==(j>>(i-1)))
dp[i][j]+=dp[i-1][j]*dp[i-1][k]*p[j][k];
}
ans=0;
for(i=0;i<(1<<n);i++)
if(dp
[i]>dp
[ans])
ans=i;
cout<<ans+1<<endl;
}
}


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