[题解]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\),则有转移:

\[f[i][j]=\max\limits_{a}\{\frac{1}{N}\sum\limits_{k=1}^N f[i-1][j-a[k]]\} \]

不难发现\(a\)的顺序不影响答案,于是将\(a\)从大到小排序,记\(n'\)为非\(0\)元素个数,上式可改写为:

\[f[i][j]=\frac{1}{N}\max\limits_{a}\{\sum\limits_{k=1}^{n'} f[i-1][j-a[k]]+(N-n')f[i-1][j]\} \]

由于\(\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;
}
posted @ 2025-05-09 20:29  Sinktank  阅读(93)  评论(0)    收藏  举报
★CLICK FOR MORE INFO★ TOP-BOTTOM-THEME
Enable/Disable Transition
Copyright © 2023 ~ 2025 Sinktank - 1328312655@qq.com
Illustration from 稲葉曇『リレイアウター/Relayouter/中继输出者』,by ぬくぬくにぎりめし.