Codeforces 678E:Another Sith Tournament 状压DP

Posted kiuhghcsc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 678E:Another Sith Tournament 状压DP相关的知识,希望对你有一定的参考价值。

odd-even number 

题目链接:

http://codeforces.com/problemset/problem/678/E

题意:

有n个人打擂台赛,每两个人间都有相对的胜率,主角可以操控比赛顺序,求主角最后获胜的最大概率。

 

题解:

设dp[i][j]为状态 i (二进制位代表出场选手) j 号选手第一个上场时主角的最大胜率,dp[1][0]=1.0(场上只有主角一个人主角必胜)。

状态转移方程dp[i][j]=max(dp[i][j],dp[i^(1<<j)][k]*p[k][j]+dp[i^(1<<k)][j]*p[j][k]);

 

代码

#include<stdio.h>
#include<string.h>
const int N=18;
double dp[1<<N][N],p[N][N];
double mmax(double x,double y)
{
	return x>y?x:y;
}
void solve()
{
	int n;
	memset(dp,0,sizeof(dp));
	scanf("%d",&n);
	for(int i=0;i<n;++i)
	for(int j=0;j<n;++j)
	scanf("%lf",&p[i][j]);
	dp[1][0]=1.0;
	for(int i=0;i<(1<<n);++i)
	for(int j=0;j<n;++j)
	if((i&(1<<j))) 
	for(int k=0;k<n;++k)
	if((i&(1<<k))&&j!=k) 
	dp[i][j]=mmax(dp[i][j],dp[i^(1<<j)][k]*p[k][j]+dp[i^(1<<k)][j]*p[j][k]);
	double ans=0.0;
	for(int i=0;i<n;++i)
	if(dp[(1<<n)-1][i]>ans)ans=dp[(1<<n)-1][i];
	printf("%.8f\n",ans);
}
int main()
{
	solve();
	return 0;
}

以上是关于Codeforces 678E:Another Sith Tournament 状压DP的主要内容,如果未能解决你的问题,请参考以下文章

codeforces#1234F. Yet Another Substring Reverse(子集dp)

Educational Codeforces Round 76 (Rated for Div. 2) - D. Yet Another Monster Killing Problem(贪心)(示例代码

Educational Codeforces Round 76 (Rated for Div. 2) D. Yet Another Monster Killing Problem 贪心

CodeForces903G Yet Another Maxflow Problem 扫描线 + 线段树 + 最小割

Educational Codeforces Round 53 (Rated for Div. 2)G. Yet Another LCP Problem

Educational Codeforces Round 88 (Rated for Div. 2) D. Yet Another Yet Another Task