算法 全排列 动态规划-算法实战题:创建摩尔斯电码字典计算第k个答案

问题描述

算法实战题:创建摩尔斯电码字典计算第k个答案

题目如下:计算第k个答案
摩尔斯电码字典
在没有电话的时代,摩尔斯电码是无线电传输领域中的一种常用代码。电码以短信号(短点,o)和长信号(长点,-)的不同组合表示各种文字。例如:o—表示英文字母J,而—表示英文字母M。
假设有一本以n个长点和m(n、m<=100)个短点组成的、包含所有信号的字典。例如:n=m=2,就会包含如下信号。
--oo
-o-o
-oo-
o--o
o-o-
oo--
这些信号已按照字典顺序排列好了。-的ASKII码是45,而o的ASCII码是111。因此,按照字典顺序,-在前,o在后。给定n和m时,编写代码计算出此字典的第k(k<=1,000,000,000,000)个信号。例如:上述字典的第四个信号是o--o。
要求使用蛮力法和动态规划法解题。
蛮力法我想的是先建立一个全排列的摩尔斯电码字典,再用折半查找的方式查找k的位置输出值,但问题在于这道题的字典太大,数据极多,如果m,n,k的值较大,估计这样运行下去半天都出不了结果。
动态规划法还没有思路,求大神简要分析一下,有代码就更好了

解决方案

一个信号总共n+m个字符,其中m个为短点(o),字典的信号总数用组合公式C(n+m,m)计算。
如果第一个用长点(-),前半部分数量是L=C(n+m-1,m)个;用k'和L比大小,可以知道k在前半部分还是后半部分。
前半部分,递归:在n-1个长点和m个短点中找第
k个。
后半部分,递归:在n个长点和m-1个短点中找第
k-L+1个(假定k`是自然数序号,从1开始)。

时间: 2024-11-02 14:29:23

算法 全排列 动态规划-算法实战题:创建摩尔斯电码字典计算第k个答案的相关文章

摩尔斯电码快速记忆

         本人虽然是电子信息工程专业的,可惜没玩过无线电.也没有无线电爱好者的朋友.最可笑的是我早就转行了...          最近闲来无事,突然想来记一记摩尔斯电码,网上搜到的方法不尽人意,几乎还是要死记. A  抵达  (抵达机场) B  打的弟弟 (打的吧弟弟) C  打的打的 (打的打的,弟弟不耐烦地说) D  打滴滴 (打滴滴热线) E  滴 (滴--) F  滴滴打的 G  大大的 ("滴滴打的大大滴"出租车司机愉快地吆喝道) H  弟弟弟弟 ("弟弟

qrq 0.2.1发布 摩尔斯电码学习工具

qrq是一款用于Linux和Unix操作系统的摩尔斯电码学习工具,类似于DOS程序. qrq 0.2.1版本主要是错误修正,包括OSS驱动的声音问题,和GCC4.6建立的问题),并增加了支持OS X操作系统的Core Audio运行. 软件信息:http://fkurz.net/ham/qrq.html 下载地址:http://fkurz.net/ham/qrq/qrq-0.2.1.tar.gz

算法 全排列 动态规划-有一个由数字1,2,3,4,5,6,7,8,9组成的数字串(长度不超过200),问如何将M个加号插入这个串中

问题描述 有一个由数字1,2,3,4,5,6,7,8,9组成的数字串(长度不超过200),问如何将M个加号插入这个串中 所得的算术表达式的值最小,加号不能加在数字串的最前面或最末尾,也不应有两个或两个以上的加号相邻 解决方案 什么语言啊?没分给吗? 解决方案二: 什么语言啊?没分给吗? 解决方案三: VB.NET假定你的字符串变量名是TXTDIM TXT1DIM NEWTXT AS STRINGDIM A AS INT32FOR A=1 TO LEN(TXT)IF A=LEN(TXT) THEN

字母全排列快速算法C代码

全排列,比如字母ABC,所有排列有A ,AB,AC,ABC,ACB,B,BA,BC,BAC,BCA,C,CA,CB,CAB,CBA. //原理是插入, 在一个字符串的所有位置插入新字符.//如: AB 插入C , 位置有 1A2B3, 插入后形成 CAB ACB ABCchar *AllList(char *str, int *pNum)...{ int i, j, k, n; int len = strlen(str); int Total = 0; int count, oldcount;

动态规划算法

斐波纳契数列F(n) n 0 1 2 3 4 5 6 7 8 9 10 F(n) 1 1 2 3 5 8 13 21 34 55 89 递归 vs 动态规划 递归版本(太慢): int f(int n) { if(n <= 1) return 1; else return f(n-1)+f(n-2); } 动态规划版本(有效率!算法复杂度是 O(n)): int a[1000]; int f(int n) { a[0]=a[1]=1; for(int i=2; i<=n; i++) a[i]=

1.4买书问题之贪心算法和动态规划

对于自己的白痴程度,自己已经快无法忍受了,到现在还不明白贪心算法和动态规划. 1.贪心算法 在对问题求解时,总是做出当前看来最好的选择,也就是说它不从整体最优上加以考虑,而是仅在局部考虑最优解. 虽然,它不能为所有问题提供最优解答,但是对广泛问题能产生整体最优解或近似解. 基本思路: 1.建立数序模型 2.把问题分解若干子问题,依次求解 3.把局部最优解合成原问题的一个解 2.动态规划 通过百度一下,从百度知道得到了一个很好的解答! 动态规划的基本思想就是把全局问题化为局部问题,为了全局优化必须

动态规划法求文本串的最优分行问题河海大学考博计算机算法设计与分析真题着急求解中

问题描述 动态规划法求文本串的最优分行问题河海大学考博计算机算法设计与分析真题着急求解中 列表并至少给出4步典型过程,求文本串"Do you like those people who always think of money and cannot remember the past."在列宽为15,惩罚函数为行空余空间的平方(最后一行不计惩罚)时的最优分行方案.不需要给出具体的实现代码.用动态规划算法给出列表

《Mahout算法解析与案例实战》一一

3.1 Canopy算法 3.1.1 Canopy算法简介在生活中,我们可以使用聚类解决很多问题,就像本章开始提到的几个例子一样.传统的聚类算法对于一般的应用问题(基本都是小数据量)都是可以解决的,但是当数据变得很大的时候,就有点"力不从心"了.这里的数据变得很大指的是:①数据的条目很多,整个数据集包含的样本数据向量很多:②针对①中的每个样本数据向量其维度很大,即包含多个属性:③要聚类的中心向量很多.当我们所要应用聚类算法的数据是上面所述情况时,传统的聚类方法应用起来就会相当棘手,这时

《趣题学算法》—第1章1.2节简单的数学计算

1.2 简单的数学计算以上那样利用循环重复将部分数据简单地累加,可以解决很多计数问题.然而,如果计数问题可以通过数学计算直接得出结果,往往可以大大改善算法的时间效率,请看下列问题. 问题1-5 小小度刷礼品图片 7 问题描述 一年一度的百度之星大赛又开始了,这次参赛人数创下了吉尼斯世界纪录.于是,百度之星决定奖励一部分人:所有资格赛提交ID以x结尾的参赛选手将得到精美礼品一份. 小小度同学非常想得到这份礼品,于是他就连续提交了很多次,提交的ID从a连续到b.他想知道能得到多少份礼品,你能帮帮他吗