题意:有n位选手,已知n位选手之间两两获胜的概率,问主角(第一个选手)最终站在擂台上的概率是多少?

思路:一看数据范围肯定是状压DP,不过虽然是概率DP,但是需要倒着推;我们如果正着推式子的话,初始状态是不确定的,因为并不知道一开始把哪个人放在擂台上最后主角获胜的概率最大。所以我们可以假设主角最后获胜的概率是1,然后倒着推。设dp[i][j]表示现在站在擂台上的是i号选手,状态是j,主角获胜的最大概率,其中状态j的k位置是1代表第k - 1个选手还没有被淘汰。所以dp[i][j] = max(dp[i][j ^ (1 << k)] * a[i][k] + dp[k][j * (1 << i)] * a[k][i]).代表的决策是:现在站在擂台上的人是i,如果k去挑战有2种情况:1,k获胜了,那么转移到dp[k][j * (1 << i)], 转移概率是a[k][j],k失败了同理。那么在当前状态选择k去挑战擂台的获胜的总概率是两种可能获胜概率的总和。

代码:

#include <bits/stdc++.h>
#define db double
using namespace std;
const int maxn = 100010;
db dp[18][1 << 18];
db a[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", &a[i][j]);
dp[0][1] = 1;
for (int i = 1; i < (1 << n); i++) {
for (int j = 0; j < n; j++) {
if((i >> j) & 1) {
for (int k = 0; k < n; k++) {
if(k == j) continue;
if((i >> k) & 1) {
dp[j][i] = max(dp[j][i], dp[k][i ^ (1 << j)] * a[k][j] + dp[j][i ^ (1 << k)] * a[j][k]);
}
}
}
}
}
db ans = 0;
for (int i = 0; i < n; i++)
ans = max(ans, dp[i][(1 << n) - 1]);
printf("%.7lf\n", ans);
}

  

最新文章

  1. Base64编码【转】
  2. Sublime3和Chrome配置自动刷新网页【实测可用】
  3. 【荐】使用eval()、new Function()将JSON字符串转换为JSON对象
  4. 使用junit测试用例
  5. 11.6---矩阵查找元素(CC150)
  6. IOS开发之进阶篇第一章 - 姿势识别器UIPanGestureRecognizer
  7. Could not find a storyboard named &#39;Main&#39; in bundle NSBundle
  8. jqGrid 学习
  9. qt-vs-addin:Qt4和Qt5之VS插件如何共存与使用
  10. MFC解决Static控件背景透明时文本覆盖重影
  11. [Alpha阶段]事后分析博客
  12. Python全栈-magedu-2018-笔记8
  13. php7-编译安装参数
  14. Java8新特性_stream API 练习
  15. tomcat8.5配置redis实现session共享(tomcat-redis-session-manager-master)
  16. ORA-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1498], [18713], [18720]
  17. eclipse svn登陆用户保存信息删除
  18. PMP_PMP考试须知
  19. soapUI-DataSource
  20. 转 How do GraphQL remote schemas work

热门文章

  1. HDU 1264 Counting Squares (线段树-扫描线-矩形面积并)
  2. @Autowired &amp; @Resource 区别 &amp; 解读@Bean
  3. Regexper:牛逼的 JavaScript 正则可视化工具
  4. list.ForEach的用法
  5. new与malloc的区别,以及内存分配浅析
  6. 可以随时查找的max栈和max队列——面试
  7. STM32之中断
  8. 最大开源代码sourceforge 简介 及视音频方面常用的开源代码
  9. struts2学习(14)struts2文件上传和下载(4)多个文件上传和下载
  10. Java中的 super和this