CF498B


动态规划f[i][j]表示前i秒时间听了j首歌的概率,则有:

\(f[i][j]=∑f[i-k][j-1]*(1-p_j)^{k-1}*p_j\)

k枚举i秒前的每一秒,要求前i-1秒都不跳歌,且在第i秒跳歌

这个方程直接转移的时间复杂度为\(O(NT^2)\)。


尝试进行优化。

观察可以发现,f[i][j]与f[i-1][j]的方程基本不变,考虑直接从f[i-1][j]转移到f[i][j]。

时间复杂度降到\(O(NT)\)。


#include <bits/stdc++.h>
using namespace std;
const int N=5005;
int t[N],n,m;
double p[N],f[N][N];
signed main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
scanf("%lf%d",&p[i],&t[i]);
p[i]/=100; //变成概率
}
/*初始化*/
f[0][0]=1;
double sum=0;
/*DP*/
for(int i=1;i<=n;i++){
double ans=0,tp=pow(1-p[i],t[i]);
for(int j=i;j<=m;j++){
ans+=f[i-1][j-1];
if(j-t[i]>=1) ans-=f[i-1][j-t[i]-1]*tp;
f[i][j]=ans*p[i];
if(j-t[i]>=0) f[i][j]+=f[i-1][j-t[i]]*tp;
ans*=1-p[i];
sum+=f[i][j];
}
}
printf("%.9lf",sum);
}

CF498B Name That Tune(动态规划dp)的更多相关文章

  1. 动态规划dp

    一.概念:动态规划dp:是一种分阶段求解决策问题的数学思想. 总结起来就一句话:大事化小,小事化了 二.例子 1.走台阶问题 F(10):10级台阶的走法数量 所以:F(10)=F(9)+F(8) F ...

  2. 算法-动态规划DP小记

    算法-动态规划DP小记 动态规划算法是一种比较灵活的算法,针对具体的问题要具体分析,其宗旨就是要找出要解决问题的状态,然后逆向转化为求解子问题,最终回到已知的初始态,然后再顺序累计各个子问题的解从而得 ...

  3. 【转】动态规划DP

    [数据结构与算法] DP 动态规划 介绍 原创 2017年02月13日 00:42:51 最近在看算法导论. DP全称是dynamic programming,这里programming不是编程,是一 ...

  4. Codeforces 498B Name That Tune 概率dp (看题解)

    Name That Tune 刚开始我用前缀积优化dp, 精度炸炸的. 我们可以用f[ i ][ j ] 来推出f[ i ][ j + 1 ], 记得加加减减仔细一些... #include<b ...

  5. 动态规划DP的优化

    写一写要讲什么免得忘记了.DP的优化. 大概围绕着"是什么","有什么用","怎么用"三个方面讲. 主要是<算法竞赛入门经典>里 ...

  6. hdu 1421:搬寝室(动态规划 DP + 排序)

    搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  7. hdu 2059:龟兔赛跑(动态规划 DP)

    龟兔赛跑 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  8. Luogu 2627 修建草坪 (动态规划Dp + 单调队列优化)

    题意: 已知一个序列 { a [ i ] } ,求取出从中若干不大于 KK 的区间,求这些区间和的最大值. 细节: 没有细节???感觉没有??? 分析: 听说有两种方法!!! 好吧实际上是等价的只是看 ...

  9. Codeforces Round #284 (Div. 2) D. Name That Tune [概率dp]

    D. Name That Tune time limit per test 1 second memory limit per test 256 megabytes input standard in ...

随机推荐

  1. Eclipse中SVN分支与合并

    一.创建分支 Eclipse中利用svn插件创建分支,如下图 分支创建完毕,查看svn资源库中可以看到,分支信息: 二.分支合并主干 1.切换到分支,如图 切换: 2.修改分支信息 在pojo中新增T ...

  2. DevOps之Pipeline集成junit、jacoco、SonarQube(二)

    一.准备工作 1.准备一个持续集成的代码工程 工程下载地址: Github地址为:https://github.com/zbbkeepgoing/springboot-demo 2.springboo ...

  3. chr ord 去重

    找不同字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. def func(s, t): num1 = 0 num2 = 0 for i in s: nu ...

  4. inline元素导航栏案例

    练习一个超链接元素在文档流当中,a标签显示出来的inline这种元素的特性.我们可以用display来将它转换成inline-block类型,这样我们就可以设置它的高度,宽度和它的背景颜色等等特性了. ...

  5. Spring前台填充数据

    举例: <div>${userinfo.name}</div>   显示规则 1.先判断对象有没有存在,对象存在的时候,才会查找对象里的字段.这个时候字段必须正确.2.如果对象 ...

  6. Win 7无法安装Microsoft .NET Framework 4.6.2

    造冰箱的大熊猫@cnblogs 2018/9/6 在Windows 7 64位计算机上安装某个软件时,安装程序提示需先安装Microsoft .NET Framework 4.6.2.本来以为小事一桩 ...

  7. HDU 6071 Lazy Running (最短路)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6071 题解 又是一道虐信心的智商题... 首先有一个辅助问题,这道题转化了一波之后就会化成这个问题: ...

  8. Unity3D_(游戏)双人3D坦克_简易版

    双人3D坦克实现 player1: WSAD控制上下左右 空格键发射炮弹 player2: IKJL可控制上下左右 B键发射炮弹 每个坦克只有100hp,子弹击中1次扣30hp,hp时时显示在坦克上 ...

  9. C++入门经典-例6.1-一维数组元素

    1:代码如下: // 6.1.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> using ...

  10. SpringMVC配置多个自定义拦截器

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...