ABC266 E(概率dp)

题目链接

  题目大意:投骰子每次会得到一个点数,可以选择是否继续,如果继续的将会得到一个新的点数,如果结束那么当前的点数将是最后的所得到的点数。求所能得到的最大期望值是多少。
  思路:
    算是一个比较典型的概率dp,考虑是否继续投下去,如果下一次投的点数小于当前的点数,那肯定不会投下去而是选择结束,否则继续投下去。这样我们就得到了dp的转移方程dp[i]={dp[i1]+dp[i]j<dp[i1]dp[i]+jjdp[i1]dp[i]=dp[i]/6

int n; std::cin >> n; std::vector<double> dp(n + 1); dp[1] = 3.5; for (int i = 2; i <= n; i++) { for (int j = 1; j <= 6; j++) { if (j >= dp[i - 1]) dp[i] += 1.0 * j; else dp[i] += dp[i - 1]; } dp[i] /= 6; } std::cout << std::fixed << std::setprecision(10) << dp[n] << "\n";

    拓展: 此题的数据范围只有n100所以这么写是肯定可以的,但是如果n109那就需要去找一些性质了,比如我们知道当n=10的时候期望就已经达到了5.65,那么我们可以发现此时的状态转移已经确定了,只有当点数是6的时候才会继续下去,所以dp[i]=dp[i]+(j5?dp[i1]:6).那么我们就可以考虑用一个矩阵加速这个递推,这样我们就可以在n很大的时候实现这个递推的过程。


__EOF__

本文作者HoneyGrey
本文链接https://www.cnblogs.com/Haven-/p/16661044.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   浅渊  阅读(49)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示