cogs1667[SGU422]傻叉小明打字
其实和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]傻叉小明打字的更多相关文章
- HDU 3791 二叉搜索树 (数据结构与算法实验题 10.2 小明) BST
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=3791 中文题不说题意. 建立完二叉搜索树后进行前序遍历或者后序遍历判断是否一样就可以了. 跟这次的作业第 ...
- hdu 4506 小明系列故事——师兄帮帮忙【幂取模乱搞】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 小明的密码-初级DP解法
#include #include #include using namespace std; int visited[5][20][9009];// 访问情况 int dp[5][20][9009] ...
- 小明系列问题――小明序列(LIS)
小明系列问题――小明序列 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- ACM 擅长排列的小明
擅长排列的小明 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 小明十分聪明,而且十分擅长排列计算.比如给小明一个数字5,他能立刻给出1-5按字典序的全排列,如果你想 ...
- ACM 懒省事的小明
懒省事的小明 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 小明很想吃果子,正好果园果子熟了.在果园里,小明已经将所有的果子打了下来,而且按果子的不同种 ...
- 管闲事的小明-nyoj51
描述某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米.我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置:数轴上的每个整数点,即0,1,2,……,L,都种有一棵 ...
- HDU2096 小明A+B
入门级都没到的水题!看到顺便就做了,AC记录喜+1 Description 小明今年3岁了, 现在他已经能够认识100以内的非负整数, 并且能够进行100以内的非负整数的加法计算. 对于大于等于100 ...
- 小明A+B[HDU2096]
小明A+B Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
随机推荐
- MySQL高级第三章——查询截取分析
一.查询分析 1.永远小表驱动大表 使用小的数据集驱动大的数据集. //复习 EXISTS 的知识:SELECT ... FROM tb WHERE EXISTS (subquery) 是因为前后数据 ...
- Luogu2917_ [USACO08NOV]奶牛混合起来Mixed Up Cows_KEY
题目传送门 看到数据范围就果断装压. 设f[i][j]表示i状态下最后一个数字为a[j]. code: #include <cstdio> using namespace std; ]; ...
- 食物链_KEY
食物链 (eat.pas/c/cpp) [ 问题描述] 动物王国中有三类动物 A,B,C, 这三类动物的食物链构成了有趣的环形. A 吃 B, B 吃C, C 吃 A.现有 N 个动物, 以 1-N ...
- getSteam
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- linux 解压命令大全[转]
本文转自: http://www.cnblogs.com/eoiioe/archive/2008/09/20/1294681.html .tar 解包:tar xvf FileName.tar打包: ...
- django1.11+xadmin的搭建
1.git clone https://github.com/sshwsfc/xadmin.git或者直接下载zip包 2..在项目根目录下建一个extra_apps的包,将xadmin源码包存放在里 ...
- Codeforces Round #495 (Div. 2) Sonya and Matrix
正常没有正方形的限制下,值为i的点个数4i 那么从0开始遍历,第一个不为4i的值就是min(x, y) 由于对称性我们姑且令x为这个值 我们先列举n*m=t的各种情况 对于一对n, m.我们已经知道n ...
- phpanalysis提取关键字
最近在开发一个文章模块功能,设计那边提出要给文章生成对应标签,用于文章关联推送,这里和大家分享一下实现过程: 这里需要用到PHPAnalysis,下载链接如下 链接:https://pan.baidu ...
- lock+Condition
关键字 synchronized+wait/notify/notifyAll可以实现等待/通知模式,类ReentrantLock可以实现同样的功能,但需要借助Condition对象.Condition ...
- 用命令从mysql中导出/导入表结构及数据
在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看:mysqldump最常用的:mysqldump -uroot -pmysql databasefoo t ...