zoukankan      html  css  js  c++  java
  • poj 3071 Football 概率DP

    概率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[n][i]>dp[n][ans])
                    ans=i;
            cout<<ans+1<<endl;
        }
    }
    View Code
  • 相关阅读:
    Hibernate Validation注解列表
    Java_Shell多线程
    Lua读写文件
    shell导出和导入redis
    大文件读写
    Java_Hbase优化
    控制语句if
    字典(DICT)
    元组Tuple
    Session 会话
  • 原文地址:https://www.cnblogs.com/xin-hua/p/3233427.html
Copyright © 2011-2022 走看看