Codeforces 678E 状压DP
题意:有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);
}
Codeforces 678E 状压DP的更多相关文章
- Codeforces 8C 状压DP
题意:有个人想收拾行李,而n个物品散落在房间的各个角落里(n < 24).现在给你旅行箱的坐标(人初始在旅行箱处),以及n个物品的坐标,你一次只能拿最多两个物品,并且拿了物品就必须放回旅行箱,不 ...
- Codeforces 1215E 状压DP
题意:给你一个序列,你可以交换序列中的相邻的两个元素,问最少需要交换多少次可以让这个序列变成若干个极大的颜色相同的子段. 思路:由于题目中的颜色种类很少,考虑状压DP.设dp[mask]为把mask为 ...
- CodeForces 11D(状压DP 求图中环的个数)
Given a simple graph, output the number of simple cycles in it. A simple cycle is a cycle with no re ...
- codeforces 1185G1 状压dp
codeforces 1185G1. Playlist for Polycarp (easy version)(动态规划) 传送门:https://codeforces.com/contest/118 ...
- Codeforces 1155F 状压DP
题意:给你一张图,问最少保留多少条边,使得这张图是边双联通分量. 思路:如果一个点集中的点已经是边双联通分量,那么从这个点集中的点x出发,经过若干个不是点集中的点,回到点集中的点y(x可能等于y),那 ...
- Codeforces - 71E 状压DP
参考官方题解 #include<bits/stdc++.h> #define rep(i,j,k) for(register int i=j;i<=k;i++) #define rr ...
- codeforces Diagrams & Tableaux1 (状压DP)
http://codeforces.com/gym/100405 D题 题在pdf里 codeforces.com/gym/100405/attachments/download/2331/20132 ...
- Codeforces Gym 100015F Fighting for Triangles 状压DP
Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...
- Codeforces Gym 100610 Problem K. Kitchen Robot 状压DP
Problem K. Kitchen Robot Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10061 ...
随机推荐
- nginx fastcgi 优化
fastcgi_cache_path /usr/local/nginx/fastcgi_cache levels=1:2 keys_zone=TEST:10m inactive=5m; fastcgi ...
- oracle11g安装(win10)
oracle11g安装(win10) 0.安装环境 1.安装包下载 1)http://www.oracle.com/technetwork/database/enterprise-edition/do ...
- Go语言学习笔记 package
加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 strings import "strings" strings包实现了用于操作字符的简单函数 ...
- 【转】linux中shell变量$#,$@,$0,$1,$2的含义解释
原文网址:http://www.cnblogs.com/fhefh/archive/2011/04/15/2017613.html linux中shell变量$#,$@,$0,$1,$2的含义解释: ...
- 自定义显示提示一段时间自动消失ShowMsgText控件
public partial class ShowMsgText : Label { public string TextMsg { get { return Text; } set { timer1 ...
- 通过修改注册表建立Windows自定义协议
引言 本文主要介绍注册表的概念与其相关根项的功能,以及浏览器如何通过连接调用自定义协议并与客户端进行数据通信.文中讲及如何通过C#程序.手动修改.安装项目等不同方式对注册表进行修改.其中通过安装项目对 ...
- sourceTree 添加 ssh key 方法【转】
1.使用 git 客户的生成公私钥:id_rsa.id_rsa.pub 1.1设置Git的user name和email: $ git config --global user.name " ...
- python md5 请求 构造
-----------------md5加密的方法:---------------------------------- import hashlib m = hashlib.md5() ...
- java代码------实现从控制台输入整型,
总结:主要是方法的调用不能错,比如浮点型,整型,字节型,so.on int ====hasNextInt() float--------hasNextfloat() short ====hasNext ...
- 阿里云中域名的MX记录添加方法
如何添加阿里云的MX记录 1. 登录阿里云,点击“云解析”,点击自己想要添加MX记录的域名: 2. 点击新手引导设置: 3. 点击解析设置,自动跳出“设置网站”和“设置邮箱”: 4. 跳出的页面,选择 ...