AT_abc404_f [ABC404F] Lost and Pound 题解
upd on 2025.11.14 根据要求删除部分“喵”语气词。
你们的喵喵又来啦!
上次我写了一篇紫题题解,今天来写 ABC 404 F 的题解啦!
首先评价一下这个题目,嗯非常的不错啊,但是一眼看上去很难的感觉。一做发现其实并不难的喵,大家千万不要怕呀。
好的咱们来说下题意喵。
小 B 有
现在要进行
当这所有
接下来就是思路部分啦。有点长但很详细,大家要认真阅读哦。
这个题目一看就是概率 DP,是吧?那不就好办了吗,直接朝着这个方向去思考嘛!
在本题中正着整是不大好弄的,因此我们反过来喵。咱们定义
好的喵,接下来一步就是状态转移了。这一步是最最重要的。
注意到按钮都是被小 B 乱序排列的,那我们在按下按钮的时候不妨假设只按下前
好的叽里呱啦一大串终于是定下了分配喵。那么我们就根据每一种分配方法,来计算对应的概率就可以啦。
这样说也太模糊了吧!怎么计算概率?嘿嘿,你说到重点上来了!其实上很简单的,首先咱们有
那这样是不是就完成了?好像不对,有一步还没讲清楚!哪一步?就是拆分的那一步啦!我们的
我们可以用一个 vector 类型的 vector(人类智慧做法哈哈),取名叫
这样,咱们就结束了本题。是不是还挺简单的喵?
最后我亮一个代码吧。是对照上面的思路来的。当然啦保证对的喵,不信看提交记录嘛!当然请各位不要抄袭我的代码,多谢!
#include<bits/stdc++.h>
using namespace std;
int n,t,m,k;double dp[35][35];
vector<int> now;vector<vector<int>> fp;
void Init_Makefp(int sum,int lst){
if(!sum){
if(now.size()<=n)
fp.push_back(now);
return;
}
for(int i=min(sum,lst);i>0;i--){
now.push_back(i);
Init_Makefp(sum-i,i);
now.pop_back();
}
return;
}
int main(){
cin>>n>>t>>m>>k;
Init_Makefp(m,m);dp[0][k]=1.0;
for(int i=1;i<=t;i++)
for(int j=0;j<=k;j++)
for(auto s:fp){
double ans=dp[i-1][j]*(n-s.size());
for(int u:s)ans+=dp[i-1][min(k,j+u)];
dp[i][j]=max(dp[i][j],ans/n);
}
printf("%.10lf",dp[t][0]);
return 0;
}
既然都看到这里了,还麻烦你给可爱的喵喵留下一个小小的赞吧,万分感谢喵!