cf 678E Another Sith Tournament

来源:互联网 发布:mysql 主键索引作用 编辑:程序博客网 时间:2024/05/29 15:10

状压DP,注意顺序和转移。(另:若用dp[i][S]表示i获胜的概率,是否可做?感觉其实和直接表示1的胜率差不太多,只是后者不太好想到)

//QWsin#include<cmath>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=20;const int maxm=(1<<18)+10;double p[maxn][maxn];double dp[maxn][maxm];//dp[i][S]表示i胜,S集合还没比,1的胜率 int main(){    int n;cin>>n;    dp[1][0]=1;    for(int i=1;i<=n;++i)        for(int j=1;j<=n;++j)            scanf("%lf",p[i]+j);    int ALL=(1<<n) - 1;    for(int S=1;S<ALL;++S)    {        for(int i=1;i<=n;++i) if(!(S & (1<<(i-1)))) //枚举胜者        {            for(int j=1;j<=n;++j) if(S & (1<<(j-1)))            {                dp[i][S]=max(dp[i][S],dp[j][S ^ 1<<(j-1)]*p[j][i]+dp[i][S^1<<(j-1)]*p[i][j]);            }        }    }    double ans=0;    for(int i=1;i<=n;++i)ans=max(ans,dp[i][ALL ^ (1<<(i-1))]);    cout<<ans;    return 0;}
0 0
原创粉丝点击