[题解]ABC404F Lost and Pound
[ABC404F] Lost and Pound ~ AtCoder
根据题意,玩家所知道的信息,仅有“当前的轮数”和“正确按钮已经被按下多少次”,所以可以设计DP数组:
- 令\(f[i][j]\)表示“还剩\(i\)轮结束,还要按\(j\)次正确按钮”的获胜概率。
则初始状态为\(f[0\sim T][0]=1\),所求答案即为\(f[T][K]\)。
考虑如何转移到\(f[i][j]\)。
实际上就是要给每个按钮分配一个按下的次数\(a_1,a_2,\dots,a_n\),其中\(\sum\limits_{i=1}^n a_i=M\),则有转移:
\]
不难发现\(a\)的顺序不影响答案,于是将\(a\)从大到小排序,记\(n'\)为非\(0\)元素个数,上式可改写为:
\]
由于\(\sum\limits_{i=1}^{n'} a_i=M\),所以\(n'\le \min(N,M)\),有\(2\)种解法。
使用DFS
即枚举每个\(n'\),对于每个\(n'\),爆搜对应的\(a\)序列。
通过爆搜可以得出,\(n'=30\)时,共有\(5604\)种拆分方法,搜索树节点数为\(54563\),所以总时间复杂度\(O(TK\times(5604+54563))\le 54150300\),可以通过。
用DP实现分拆
难点在于计算式子中的:\(\max\limits_{a}\{\sum\limits_{k=1}^{n'} f[i-1][j-a[k]]\}\)。
可以发现,\(f[i][j]\)仅取决于\(a\)序列中,\([1,M]\)每个值被取了多少次。
具体来说,值\(x\)每被取一次,对橙色式子就有\(f[i-1][j-x]\)的贡献。
枚举\(a\)数组的过程,转化为如下问题。
共有\(M\)个物品,每个物品有无限多个。
第\(i\)个物品体积为\(x\),价值为\(f[i-1][j-x]\)。
上面的橙色式子即为\(g[n'][M]\),表示恰好取\(n'\)个物品,体积总和恰为\(M\)的最大价值。将其代入\(f[i][j]\)的递推式即可完成递推。
可以用类似背包的方式来计算\(g\)。
不过由于第一维和传统背包有些区别,所以似乎没法优化到\(O(M^2)\)(如果有的话请在评论区告诉我),该步骤时间复杂度为\(O(M^3)\)。
总时间复杂度\(O(TKM^3)\),比爆搜更优。
注意到代码没有用“体积总和恰好为\(M\)”而是“体积总和最大为\(M\)”来转移,但不影响结果。因为“按\(M\)个按钮”一定不劣于“按\(<M\)个按钮”。
点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int T=31,M=31,K=31;
int n,t,m,k;
double f[T][K],g[M][M];
//f[i][j]:还剩 i 轮结束,还要按 j 次正确按钮的获胜概率
//g[i][j]:恰好取 i 个物品,体积总和最大为 j 的最大价值
signed main(){
cin>>n>>t>>m>>k;
for(int i=0;i<=t;i++) f[i][0]=1;
for(int i=1;i<=t;i++){
for(int j=1;j<=k;j++){
for(int x=1;x<=min(n,m);x++){
for(int y=1;y<=m;y++){
g[x][y]=0;
for(int z=1;z<=min({m,j,y});z++){
g[x][y]=max(g[x][y],g[x-1][y-z]+f[i-1][j-z]);
}
}
}
for(int x=1;x<=min(n,m);x++) f[i][j]=max(f[i][j],g[x][m]+(n-x)*f[i-1][j]);
f[i][j]/=n;
}
}
cout<<fixed<<setprecision(18)<<f[t][k]<<"\n";
return 0;
}
[题解]ABC404F Lost and Pound的更多相关文章
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
- noip2016十连测题解
以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...
- BZOJ-2561-最小生成树 题解(最小割)
2561: 最小生成树(题解) Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1628 Solved: 786 传送门:http://www.lyd ...
- Codeforces Round #353 (Div. 2) ABCDE 题解 python
Problems # Name A Infinite Sequence standard input/output 1 s, 256 MB x3509 B Restoring P ...
- 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解
题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...
- 2016ACM青岛区域赛题解
A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- poj1399 hoj1037 Direct Visibility 题解 (宽搜)
http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...
- 网络流n题 题解
学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...
- CF100965C题解..
求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...
- JSOI2016R3 瞎BB题解
题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...
随机推荐
- Ubuntu 初始设置:启用 root 账户、启用密码登录、启用Key登录、ssh超时、修改主机名
新购买的Ubuntu服务器,默认禁用了root账户,如果想启用root账户的公钥登录,请使用以下方法: vi /etc/ssh/sshd_config # 编辑ssh配置文件 PermitRootLo ...
- Springboot笔记<12>数据访问
springboot数据访问 springboot整合JDBC JdbcTemplate是Spring对JDBC的封装,目的是使JDBC更加易于使用.JdbcTemplate是Spring的一部分.J ...
- K&R 语法 vs. ANSI C 语法
由于项目中使用了Bison,看到有个奇怪的C语言的语法,查了一下居然是要兼容早期的C标准 Bison 是什么? Bison 是一个 语法分析器生成器(parser generator),它用于根据 上 ...
- 重要通知:spring-ai-hunyuan 已兼容 Spring AI 稳定版!
最近有小伙伴在使用 mvn 仓库中的 1.0.0-M6 版本时,已经遇到一些兼容性问题和未知异常.本着更好地维护 spring-ai-hunyuan 仓库,我这几天熬夜更新并整理了对 Spring A ...
- 直击运维痛点,大数据计算引擎 EasyMR 的监控告警设计优化之路
当企业的业务发展到一定的阶段时,在系统中引入监控告警系统来对系统/业务进行监控是必备的流程.没有监控或者没有一个好的监控,会导致开发人员无法快速判断系统是否健康:告警的实质则是"把人当服务用 ...
- 数栈V6.0全新产品矩阵发布,数据底座 EasyMR 焕新升级
4月20日,袋鼠云成功举行了以"数实融合,韧性生长"为主题的2023春季生长大会.会上,袋鼠云自主研发的一站式大数据基础软件--数栈V6.0产品矩阵全新发布.对旗下大数据基础平台. ...
- 微软开源 Azure Functions MCP Extension
Azure Functions MCP Extension 是微软推出的开源扩展库,旨在将 Azure Functions 与模型上下文协议(Model Context Protocol, MCP) ...
- 《MySQL实战45讲》个人笔记-实战篇
拜读了林晓斌大佬的<MySQL实战45讲>,特意做个知识点总结,以便后期回忆. 09.普通索引和唯一索引,应该怎么选择? 查询时:普通索引找到第一个后,还会往下找,直到碰到第一个不满足条件 ...
- vivo Pulsar 万亿级消息处理实践(3)-KoP指标异常修复
作者:vivo 互联网大数据团队- Chen Jianbo 本文是<vivo Pulsar万亿级消息处理实践>系列文章第3篇. Pulsar是Apache基金会的开源分布式流处理平台和消息 ...
- sql 查找最晚入职员工信息
简介 order by 然后 limit select * from employees order by hire_date desc limit 1;