博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #284 (Div. 2): D. Name That Tune(概率DP)
阅读量:2143 次
发布时间:2019-04-30

本文共 1031 字,大约阅读时间需要 3 分钟。

题目链接:

题意:有n首曲子,一首一首的放给你听,然后要你猜歌名,对于第i首歌,你前ti-1秒每一秒猜对概率为pi,在第ti秒你必猜对,一旦第i首歌被猜对,立刻播放下一首,求T秒之后你猜对歌曲数量的期望

思路:dp[i][j]表示第i首歌刚好在第j秒时被猜对

有转移dp[i][j] = ∑(dp[i-1][j-k]*p[i]^(k-1)*(1-p[i])(1<=k<=t[i]-1))+dp[i-1][j-t[i]]*p[i]^(t[i]-1)

暴力转移复杂度O(nT²),但求和部分可以前缀和优化,复杂度O(nT)

最后答案就是将所有的dp[i][j]加在一起,为什么是这样算的呢?因为你每转移一次就相当于多猜对一首歌,所以最后就是将所有的转移乘上发生这次转移的概率,即dp[i][j]

#include
#include
using namespace std;double p[5005], dp[5005][5005];int t[5005];double Pow(double x, int k){ double ans = 1; while(k) { if(k%2) ans = ans*x; x = x*x; k /= 2; } return ans;}int main(void){ double now, ans, temp; int n, T, i, j, k; scanf("%d%d", &n, &T); for(i=1;i<=n;i++) { scanf("%lf%d", &p[i], &t[i]); p[i] /= 100; } dp[0][0] = 1, ans = 0; for(i=1;i<=n;i++) { now = 0; temp = Pow(1-p[i], t[i]-1); for(j=1;j<=T;j++) { now *= 1-p[i]; now += dp[i-1][j-1]*p[i]; if(j>=t[i]) now -= dp[i-1][j-t[i]]*temp*p[i]; dp[i][j] = now; if(j>=t[i]) dp[i][j] += dp[i-1][j-t[i]]*temp; ans += dp[i][j]; } } printf("%.10f\n", ans); return 0;}

转载地址:http://pqmgf.baihongyu.com/

你可能感兴趣的文章
Eclipse Memory Analyzer 使用技巧
查看>>
tomcat连接超时
查看>>
谈谈编程思想
查看>>
iOS MapKit导航及地理转码辅助类
查看>>
检测iOS的网络可用性并打开网络设置
查看>>
简单封装FMDB操作sqlite的模板
查看>>
iOS开发中Instruments的用法
查看>>
iOS常用宏定义
查看>>
什么是ActiveRecord
查看>>
有道词典for mac在Mac OS X 10.9不能取词
查看>>
关于“团队建设”的反思
查看>>
利用jekyll在github中搭建博客
查看>>
Windows7中IIS简单安装与配置(详细图解)
查看>>
linux基本命令
查看>>
BlockQueue 生产消费 不需要判断阻塞唤醒条件
查看>>
强引用 软引用 弱引用 虚引用
查看>>
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
win10将IE11兼容ie10
查看>>