其实和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. 宁波Uber优步司机奖励政策(8月24日到8月30日)

    本周奖励: 8月24日-8月30日: 滴滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http:// ...

  2. GitHub 配置指南

    Git和GitHub的区别 GitHub术语解析 配置使用 注册GitHub帐号 创建Git 创建库 复制库 社交化 Git和GitHub的区别 Git是一个分布式的版本控制系统,与SVN类似:最初由 ...

  3. Asp.net Web Api开发Help Page 添加对数据模型生成注释的配置和扩展

    在使用webapi框架进行接口开发的时候,编写文档会需要与接口同步更新,如果采用手动式的更新的话效率会非常低.webapi框架下提供了一种自动生成文档的help Page页的功能. 但是原始版本的效果 ...

  4. spring源码-自定义标签-4

    一.自定义标签,自定义标签在使用上面相对来说非常常见了,这个也算是spring对于容器的拓展.通过自定义标签的方式可以创造出很多新的配置方式,并且交给容器直接管理,不需要人工太多的关注.这也是spri ...

  5. MySQL☞in语句

    in语句: 1)列名 in(数值1,数值2,数值3…):求出满足该列的多个列值 格式: select 列名1,列名2  from 表名 where 列名 in (数值1,数值2,数值3...) 如下图 ...

  6. Resharp使用简记

    一图流: 拾贝: .字符串引号中直接回车键自动添加连接字符串 Ctrl+B:转到定义 Ctr+F11:展示类结构 Ctr+Alt+j:包围代码块 Ctr+\:注释和取消注释 Alt+Ins:重构 Ct ...

  7. [Clr via C#读书笔记]Cp10属性

    Cp10属性 属性的本质就是方法,只是看起来像字段罢了: 无参属性 就是一般属性: 字段一般要private,然后通过设置访问方法-访问器来访问:属性是方法语法变种:getset不一定要访问支持字段: ...

  8. Jedis 与 MySQL的连接线程安全问题

    Jedis的连接是非线程安全的 下面是set命令的执行过程,简单分为两个过程,客户端向服务端发送数据,服务端向客户端返回数据,从下面的代码来看:从建立连接到执行命令是没有进行任何并发同步的控制 pub ...

  9. NTP错误总结

    Ntp错误总结 解决ntp的错误 no server suitable for synchronization found 当用ntpdate -d 来查询时会发现导致 no server suita ...

  10. POJ 3304 Segments(线的相交判断)

    Description Given n segments in the two dimensional space, write a program, which determines if ther ...