GYM 101933E 状态压缩 + 记忆化搜索
2024-10-07 19:45:37
题意:我方有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));
}
最新文章
- commons-lang包中我们常用的类的作用
- Android入门(十六)调用摄像头相册
- EasyUI中Dialog的使用
- BI之SSAS完整实战教程2 -- 开发环境介绍及多维数据集数据源准备
- sql注入之你问我答小知识
- ServiceStack.Redis 之 IRedisTypedClient 04_转
- Iframe知识点
- fetch
- ThinkPHP框架的增删改
- FastDFS + Nginx 安装
- Spring注解AOP及单元测试junit(6)
- Android中,粗暴的方式,修改字体
- 高并发秒杀系统--mybatis整合技巧
- 《大道至简》第一章j愚公移山ava伪代码
- Django:视图views(二)
- C/C++返回内部静态成员的陷阱
- python初始环境安装
- JavaScript方法和技巧大全
- UVaLive 2796 Concert Hall Scheduling (最小费用流)
- rails render
热门文章
- [POI2010]OWC-Sheep
- css图片文字
- [python3]未配置locale的主机出现UnicodeDecodeError: &#39;ascii&#39; codec can&#39;t decode byte 0x....的解决
- redis配置篇
- linux配置java环境变量(详细)(转)
- 前端避免XSS(跨站脚本攻击)
- Vue开发复用组件的基本思想
- vue 组件的简单使用01
- Java中遍历数组的三种方式复习
- Shiro学习(4)INI配置