其实和CF498bName that Tune差不多

题意:

现在需要依次输入n个字符,第i个字符输入的时候有pi的概率输错,不论是第几次输入(0<=pi<=0.5).每输入一个字符的用时为1.任意时刻都可以花费t的时间检查之前输入的字符有无错误(不论检查多少个字符,t的数值都是一样的),如果有错误就需要一次一次删除字符直到所有错误字符都被删除(只能从最后面往前删,如果第i个位置出错,那么第i个位置之后的所有字符无论对不对都必须被删除).如果采取最优策略,问将全部字符正确输入的期望时间.

分析:这里我们输入字符之后还必须通过检查确保输入的字符是正确的,那么在状态定义的时候就要体现这一点.如果定义f[i]为输入前i个字符并确保前i个字符正确的期望时间,将不容易转移.概率期望的题常常采用”逆序定义状态”,那么这道题中就定义f[i]为已经输入前n-i个字符并确保前n-i个字符正确时,再输入剩下的i个字符并确保它们正确所需的最优策略下期望时间.注意这里定义的是”最后i个字符的期望用时”而不是”前i个字符的期望用时”.显然,如果当前已经确保前n-i个字符正确,之后前n-i个字符就不会再发生变化了,如果后面的字符出错我们不需要删除已经确定正确的字符.

接下来考虑如何转移.我们进行的操作序列一定是:打几个字符,检查一次并进行必要的删除,打几个字符,检查一次并进行必要的删除,打几个字符检查一次并进行必要的删除.那么我们可以进行的决策就是下一次检查之前打多少个字符:是打1个字符再检查一次,还是打2个字符再检查一次.于是我们想到枚举下一次检查之前打的字符个数x.影响我们下一步行动的只有第一个错误出现的位置,那么当下一步打x个字符时(x<=i), f[i]=p(第一个错误出现在第1个字符)*(x+t+x+f[i])+p(第一个错误出现在第2个字符)*(x+t+x-1+f[i-1])+…+p(第一个错误出现在第x个字符)*(x+t+1+f[i-x+1])+p(不出现错误)*(x+t+f[i-x])

将式子右边的f[i]移项,就可以DP了.

注意即使不出现错误,我们也是在花费t的时间检查之后才能确保没有出现错误.

边界显然是f[0]=0

枚举f[i]对应的所有x值时,可以处理一下”第一个错误出现在第j个字符的概率”,注意一个细节:”打j个字符且没有出错”和”打j+1个字符且第一个错误出现在第j+1个字符”的概率是不同的.那么我们得到了一个O(n^3)的DP,但这样是不能通过的,需要优化.

仔细观察刚才得到的式子:

f[i]=p(第一个错误出现在第1个字符)*(x+t+x+f[i])+p(第一个错误出现在第2个字符)*(x+t+x-1+f[i-1])+…+p(第一个错误出现在第x个字符)*(x+t+1+f[i-x+1])+p(不出现错误)*(x+t+f[i-x])

我们发现,p(第一个错误出现在第1个字符)对于x=1,2,3…是相同的,p(第一个错误出现在第2个字符)对于x=2,3…是相同的,这暗示我们O(n^3)的做法中有大量可以省去的重复计算.

如果打x+1个字符再进行检查,则

f[i]=p(第一个错误出现在第1个字符)*(x+1+t+x+1+f[i])+p(第一个错误出现在第2个字符)*(x+1+t+x+f[i-1])+…+p(第一个错误出现在第x个字符)*(x+1+t+2+f[i-x+1])+p(第一个错误出现在第x+1个字符)*(x+1+t+1+f[i-x])+p(不出现错误)*(x+t+f[i-x-1])

//这式子鬼知道打没打错…

然后我们发现打x字符和打x+1个字符之间的变化是可以O(1)算出来的,那么我们就可以对每个i选择最优的x,O(n^2)从f[0]推到f[n]了…

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=;
double f[maxn],p[maxn],P[maxn];
int main(){
freopen("sb_xiaoming.in","r",stdin);
freopen("sb_xiaoming.out","w",stdout);
int n,t;scanf("%d%d",&n,&t);
for(int i=;i<=n;++i)scanf("%lf",p+i);
f[]=;
for(int i=;i<=n;++i){
P[]=;f[i]=1e30;
for(int j=;j<=i;++j)P[j]=P[j-]*(-p[n-i+j]);
double tmp1=P[]*f[i-],tmp2=-P[];
for(int j=;j<=i;++j){
f[i]=min(f[i],(tmp1+j+t+tmp2)/P[]);
tmp1+=P[j+]*f[i-j-];tmp1-=P[j+]*f[i-j];tmp2+=-P[j+];
}
}
printf("%.6f\n",f[n]);
fclose(stdin);fclose(stdout);
return ;
}

cogs1667[SGU422]傻叉小明打字的更多相关文章

  1. HDU 3791 二叉搜索树 (数据结构与算法实验题 10.2 小明) BST

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3791 中文题不说题意. 建立完二叉搜索树后进行前序遍历或者后序遍历判断是否一样就可以了. 跟这次的作业第 ...

  2. hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...

  3. 小明的密码-初级DP解法

    #include #include #include using namespace std; int visited[5][20][9009];// 访问情况 int dp[5][20][9009] ...

  4. 小明系列问题――小明序列(LIS)

    小明系列问题――小明序列 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  5. ACM 擅长排列的小明

    擅长排列的小明 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想 ...

  6. ACM 懒省事的小明

    懒省事的小明 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述       小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种 ...

  7. 管闲事的小明-nyoj51

    描述某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种有一棵 ...

  8. HDU2096 小明A+B

    入门级都没到的水题!看到顺便就做了,AC记录喜+1 Description 小明今年3岁了, 现在他已经能够认识100以内的非负整数, 并且能够进行100以内的非负整数的加法计算. 对于大于等于100 ...

  9. 小明A+B[HDU2096]

    小明A+B Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

随机推荐

  1. 20145207 ms08_067攻击实验

    ms08_067攻击实验原理 实验过程 查看两台主机ip,并ping通 启动msf,查看关于ms08_067漏洞的基本信息 查看其可攻击的操作系统 查看可用载荷 查看需要设定的参数 修改LHOST(攻 ...

  2. Mybatis简单入门

    前言 之前一直有直接使用Mybatis,但是没有细致的整理出来.长时间没有使用,细致的内容都忘记了.因此借此机会,从头开始整理,以后可以直接查看此次记录的内容. Mybatis的介绍 MyBatis是 ...

  3. libevent学习四(Working with events)

    1.事件的分类 文件可写 文件可读 超时发生 信号发生 用户触发事件   2事件的生命周期        --非 persistent                                 ...

  4. oracle_列转行

    wmsys.wm_concat 将表中数据 如   ID   USERNAME    TYPE 1        刘                    下 1        刘           ...

  5. Matlab2018年最新视频教程视频讲义(包含代码)

    2018年Matlab最新视频教程视频讲义(包含代码),适合初学者入门进阶学习,下载地址:百度网盘, https://pan.baidu.com/s/1w4h297ua6ctzfturQ1791g 内 ...

  6. 使用advanced_installer将.net web程序打包为安装程序

    当项目开发完成之后,需要给客户使用时,总不能将发布后的文件全部放一起压缩后直接给客户吧,然后客户需要自行搭建环境修改配置等等,体验太差了,这时候我们就需要使用一种打包工具了,查了一些资料之后,我选择使 ...

  7. UE4蓝图小记

    http://www.element3ds.com/forum.php?mod=viewthread&tid=76930&page=1&authorid=104414 http ...

  8. 【Python+OpenCV】人脸识别基于环境Windows+Python3 version_3(Anaconda3)+OpenCV3.4.3安装配置最新版安装配置教程

    注:本次安装因为我要安装的是win10(64bit)python3.7与OpenCV3.4.3教程(当下最新版,记录下时间2018-11-17),实际中这个教程的方法对于win10,32位又或是64位 ...

  9. NO.01---今天聊聊Vuex的简单入门

    作为一款个人认为非常牛x的框架,个人使用起来得心应手,所以近期就记录一下这款框架吧. 首先说一说 Vuex 是什么? 官方给出的解释:Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它 ...

  10. JavaScript 字符串 & Math & Date

    字符串 字符串就是零个或多个排在一起的字符,放在单引号或双引号之中. 'abc' "abc" 单引号字符串的内部,可以使用双引号.双引号字符串的内部,可以使用单引号. 'key=& ...