GYM 101933E 状态压缩 + 记忆化搜索
题意:我方有n个士兵,敌方有m个,每方士兵都有一个血量,现在有k轮无差别炮火打击,每次都会从存活的士兵中随机选一人,这名士兵的HP就-1,问对方被团灭的概率有多大?
思路:因为n和m的范围很小,我们可以考虑暴力搜索,中间使用记忆化。这里状态压缩有一个小技巧,我们的正常想法是:因为士兵总数最多只有10个,我们可以用一个十位数来表示状态,每一位数代表这个士兵的现在的HP。但是我这样设计状态超时了。。。网上的状态设置的比较巧妙,网上用了12位数来表示状态,每一位代表敌方或者我方的HP为某个值的士兵还剩多少个。这样设计状态的好处在于如果有多个士兵的HP相同,那么只需向下搜索一个就行了,大大减少了搜索的分支。
代码:
#include <bits/stdc++.h>
#define LL long long
#define db double
using namespace std;
map<LL, db> dp;
int now_state[2][7];
int n, m;
LL limit;
LL get_state(void) {
LL state = 0;
for (int i = 1; i <= 6; i++)
state = state * 10 + now_state[1][i];
for (int i = 1; i <= 6; i++)
state = state * 10 + now_state[0][i];
return state;
}
db dfs(LL state, int deep) {
if(dp.count(state)) return dp[state];
if(state < 1000000) return 1;
if(deep == 0) return 0;
int cnt = 0;
db ans = 0;
for (int i = 0; i <= 1; i++)
for (int j = 1; j <= 6; j++)
cnt += now_state[i][j];
for (int i = 0 ; i <= 1; i++)
for (int j = 1; j <= 6; j++) {
if(!now_state[i][j]) continue;
now_state[i][j]--;
now_state[i][j - 1]++;
ans += dfs(get_state(), deep - 1) * (now_state[i][j] + 1) / (db) cnt;
now_state[i][j]++;
now_state[i][j - 1]--;
}
dp[state] = ans;
return ans;
}
int main() {
int k, x;
scanf("%d%d%d", &n, &m, &k);
for (int i = 1; i <= n; i++) {
scanf("%d", &x);
now_state[0][x]++;
}
for (int i = 1; i <= m; i++) {
scanf("%d", &x);
now_state[1][x]++;
}
printf("%.7lf\n", dfs(get_state(), k));
}
GYM 101933E 状态压缩 + 记忆化搜索的更多相关文章
- loj 1011(状态压缩+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25837 思路:状态压缩+记忆化搜索. #include<io ...
- HDU 4628 Pieces(状态压缩+记忆化搜索)
http://acm.hdu.edu.cn/showproblem.php?pid=4628 题意:给个字符窜,每步都可以删除一个字符窜,问最少用多少步可以删除一个字符窜分析:状态压缩+记忆化搜索 ...
- Doing Homework---hdu1074(状态压缩&&记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 有n(n<=15)门课需要做作业,每门课所需时间是used_time以及每门课作业上交的最 ...
- ACM学习历程—ZOJ3471 Most Powerful(dp && 状态压缩 && 记忆化搜索 && 位运算)
Description Recently, researchers on Mars have discovered N powerful atoms. All of them are differen ...
- light oj 1011 - Marriage Ceremonies (状态压缩+记忆化搜索)
题目链接 大概题意是有n个男的n个女的(原谅我这么说,我是粗人),给你一个n*n的矩阵,第i行第j列表示第i个女(男)对第j个男(女)的好感度,然后要安排n对相亲,保证都是正常的(无搞基百合之类的), ...
- Codeforces Gym 100231G Voracious Steve 记忆化搜索
Voracious Steve 题目连接: http://codeforces.com/gym/100231/attachments Description 有两个人在玩一个游戏 有一个盆子里面有n个 ...
- ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE(博弈,记忆化搜索)
链接https://nanti.jisuanke.com/t/31454 思路 开始没读懂题,也没注意看数据范围(1000*200的状态,记忆化搜索随便搞) 用记忆化搜索处理出来每个状态的胜负情况 因 ...
- hihoCoder-1087 Hamiltonian Cycle (记忆化搜索)
描述 Given a directed graph containing n vertice (numbered from 1 to n) and m edges. Can you tell us h ...
- 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...
随机推荐
- su 和 su - 命令有何不同
su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell:而后者连用户和Shell环境一起切换成root身份了.只有切换了Shell环境才不会出 ...
- windows如何在当前路径下快速打开cmd
直接在打开的文件夹地址栏当中输入cmd即可.
- vue撸的demo
之前做过一个layui+flask的测试平台,后来听说vue挺火,学了下,做个记录 一.想法 主要想开发几大功能,方便以后复用 1.工作中常常需要记录知识,所以我决定会做一个类似markdown笔记的 ...
- js 实现 间隙滚动效果
代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3. ...
- react 脚手架使用
下载脚手架 npm i react create-react-app //下载安装脚手架 create-react-app pro_nmae //创建一个react项目 尽量不要使用大写,因为在Lin ...
- 关于SQL中 =:的含义
一个很恶臭的例子来说明 =: 在sql语句中是做什么用的 int number= 114514: //众所周知野兽先辈的咆哮(世界级美声)是一串数字 var strSql = "select ...
- tomcat 安装时出现 Failed to install Tomcat7 service
今天在安装tomcat时提示 Failed to install Tomcat7 service了,花了大半天的时间找到了原因,下面分享给大家,希望对各位有所帮助. 应该是你卸载时直接删除目录导致的. ...
- Vue学习笔记【20】——Vue中的动画(使用动画钩子函数)
定义及使用钩子函数 定义 transition 组件以及三个钩子函数: <div id="app"> <input type="button&q ...
- Python实现中英文翻译方法总结
#Author:Chenglong Qian #Copyright :Chenglong Qian import json import requests import re import os im ...
- NX二次开发-基于NX开发向导模板的NX对Excel读写操作(OLE方式(COM组件))
在看这个博客前,请读者先去完整看完:NX二次开发-基于MFC界面的NX对Excel读写操作(OLE方式(COM组件))https://ufun-nxopen.blog.csdn.net/article ...