博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 678E Another Sith Tournament 状压DP
阅读量:4347 次
发布时间:2019-06-07

本文共 908 字,大约阅读时间需要 3 分钟。

题意:

\(n(n \leq 18)\)个人打擂台赛,编号从\(1\)\(n\),主角是\(1\)号。

一开始主角先选一个擂主,和一个打擂的人。
两个人之中胜的人留下来当擂主等主角决定下一个人打擂,败的人退出比赛,直到比赛只剩一个人。
已知任意两人之间决胜的胜率\(P_{ij}\),求主角最终能够获胜的概率。

分析:

\(d(S, i)\)表示存活的人的集合为\(S\),当前擂主为\(i \in S\),主角获胜的概率。

为了方便我们把编号设为\(0 \sim n-1\),递推边界\(d(1,0)=1\)

考虑\(d(S,i)\),枚举下一个要打擂的人\(k \in S\)

  • \(P_{ij}\)的概率\(i\)战胜\(j\),擂主为\(i\),状态转移到\(d(S-j,i)\)
  • \(P_{ji}\)的概率\(j\)战胜\(i\),擂主为\(j\),状态转移到\(d(S-i,j)\)

因为主角可以决定打擂人选\(j\),所以\(d(S,i)=max\{ P_{ij}d(S-j,i) + P_{ji}d(S-i,j) \}\)

最后枚举最开始的擂主,选一个最大值就是答案。

#include 
#include
#include
using namespace std;double p[18][18], d[1 << 18][18];int main(){ int n; scanf("%d", &n); for(int i = 0; i < n; i++) for(int j = 0; j < n; j++) scanf("%lf", &p[i][j]); d[1][0] = 1; for(int S = 3; S < (1 << n); S += 2) { for(int i = 0; i < n; i++) if(S&(1<

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/5587523.html

你可能感兴趣的文章
实现页面查看xml或json数据类似控制台效果
查看>>
Kali配置教程
查看>>
Leetcode: Combination Sum IV && Summary: The Key to Solve DP
查看>>
获取动态类型变量的属性值
查看>>
C++冒泡排序
查看>>
js 数组操作
查看>>
第522篇--DataTable to Excel C#
查看>>
C++\virtual 虚函数、纯虚函数
查看>>
asp.net mvc 4多级area实现技巧
查看>>
Solr
查看>>
MySQL binlog数据库同步技术总结
查看>>
算法设计--查找无序数组中第K大的数字
查看>>
GCC的gcc和g++区别
查看>>
CENTOS 7 和 JDK 添加中文字体
查看>>
tomcat并发优化
查看>>
welcome2
查看>>
ubuntu ssh 与 Samba安装
查看>>
C++,Windows/MFC_中L和_T()之区别
查看>>
Java NIO:FileChannel数据传输
查看>>
bzoj 2956: 模积和
查看>>