庞果网在线编程子序列的个数问题ruby解答

原创 2013年12月05日 00:08:00

题目地址: http://hero.pongo.cn/Question/Details?ID=111&ExamID=109

题目详情

本题同样来自caopengcs,只要你有兴趣,每个人都可以出题(出题入口在主页右侧边栏“贡献题目”->“我要发布”内),以下是题目详情:

子序列的定义:对于一个序列a=a[1],a[2],......a[n],则非空序列a'=a[p1],a[p2]......a[pm]为a的一个子序列,其中1<=p1<p2<.....<pm<=n。

例如:4,14,2,3和14,1,2,3都为4,13,14,1,2,3的子序列。

对于给出序列a,有些子序列可能是相同的,这里只算做1个,要求输出a的不同子序列的数量。



输入: 长度为n的数组1<=n<=100,数组元素0<=a[i]<=110

输出:子序列 的个数对1000000007取余数的结果(由于答案比较大,输出Mod 1000000007的结果即可)。


这个题目前一阵子就看过了,很长时间都没有思路。 想到 应该如何递归呢。首先想到的是按照人的计算思路来计算。

总个数 = 大小为1的自序列的个数 + 大小为2 的子序列的个数 + …… + 大小为n的子序列个数


这种思路也不是不可行,只是太过于浪费内存了, 对计算机来说应该有更好的思路吧。

后来网络搜索了一下,才找到正确的思路。思路见链接:http://www.cnblogs.com/bestDavid/p/subsequence.html


class Sequence
  def initialize(array)
    @array = array
  end

  def sub_sequence_count
    return 0 if @array.empty?
    return 1 if @array.count == 1
    equal_last_position = @array[0..-2].rindex(@array.last)
    if equal_last_position == nil
      2 * Sequence.new(@array[0..-2]).sub_sequence_count + 1
    else
      2 * Sequence.new(@array[0..-2]).sub_sequence_count - Sequence.new(@array[0...equal_last_position]).sub_sequence_count
    end
  end
end


describe Sequence do
   it "should be 1 if sequence is 1" do
     Sequence.new([1]).sub_sequence_count.should == 1
   end

   it "should be 3 if sequence is [1, 2]" do
     Sequence.new([1, 2]).sub_sequence_count.should == 3
   end

   it "should be 5 if sequence is [1, 1, 2]" do
     Sequence.new([1, 1, 2]).sub_sequence_count.should == 5
   end

   it "should be 6 if sequence is [1, 2, 1]" do
     Sequence.new([1, 2, 1]).sub_sequence_count.should == 6
   end

   it "should be 11 if sequence is [1, 2, 1, 2]" do
     Sequence.new([1, 2, 1, 2]).sub_sequence_count.should == 11
   end
end


庞果网在线编程字符串消除问题ruby解答

花了50多分钟才做出来,有点太长了,刚开始没有找到递归的终点, 然后也没有reduce的方向。 题目如下:(http://hero.pongo.cn/Question/Details?ID=85&Ex...
  • hmilym1050636281
  • hmilym1050636281
  • 2013年11月26日 00:01
  • 704

《Ruby元编程》之Open Class

例如,在下面代码中: def to_alphanumeric(s) s.gsub /[^\w\s], '' end 很显然,在上面代码中,to_alphanumberic这个方法不...
  • u012909822
  • u012909822
  • 2013年11月22日 09:59
  • 970

Ruby元编程-学习笔记(二)-方法

动态方法 使用动态方法可以有效的消除重复代码 动态调用方法class MyClass def my_method(arg) arg * 2 end endobj =...
  • gxcbuf
  • gxcbuf
  • 2016年04月22日 23:29
  • 430

ruby 元编程 学习记录-关于动态代理

ruby元编程的动态代理的说明中有一个例子,是说明如何用delega
  • liangming1021
  • liangming1021
  • 2014年05月11日 19:37
  • 445

Ruby快速入门(30分钟)

在本教程中,将探讨使用Ruby开始编程所需的基本语法,以及如何在30分钟内学习并使用Ruby编程语言。注:如果您还尚未安装Ruby开发环境,请访问环境设置页面并按照说明安装: http://www.y...
  • yiibai
  • yiibai
  • 2017年05月17日 21:42
  • 887

推荐 7 款最好的 Ruby on Rails 集成开发环境

Ruby 是个动态面向对象、通用的编程语言。它支持多种编程范式,包括面向功能和面向对象。同时它也包括一个动态类型系统和自动内存管理。 编辑器和集成开发环境(IDE)有些不同,编辑器是用来添加,编辑,...
  • kwame211
  • kwame211
  • 2017年08月05日 20:16
  • 261

不懂Ruby的程序员,如何快速读懂Ruby代码

本问答的目标读者是不了解Ruby语言、但有别的编程语言经验的人。   Ruby语言的代码可读性是很强的。本问答只把一些语法特点、以及别的语言中可能没有或不同的东西展现出来,目的在于让有别的编程语...
  • u013378306
  • u013378306
  • 2016年09月05日 11:47
  • 9959

c++开发过程中遇到的问题及解决方案

问题一: 1>JForm.obj : error LNK2019: 无法解析的外部符号 "public: virtual __thiscall JFC::JForm::~JForm(void)" (?...
  • woshizfs
  • woshizfs
  • 2014年01月06日 15:08
  • 803

七、Sketchup用ruby进行二次开发--利用Transformation实现Move工具(平移、旋转和缩放)

在Sketchup中,move工具使用的非常广泛,
  • litaosdau
  • litaosdau
  • 2014年08月16日 10:38
  • 1941

Ruby开发工具

Ruby安装 登陆中文网站https://www.ruby-lang.org/zh_cn/downloads/,根据运行平台下载,由于Ruby基于Linux平台开发,所有这里选择Linux平台的Ru...
  • jingjingtr
  • jingjingtr
  • 2014年04月05日 12:21
  • 1414
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:庞果网在线编程子序列的个数问题ruby解答
举报原因:
原因补充:

(最多只允许输入30个字)