庞果网在线编程子序列的个数问题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...

子序列的个数 --- 庞果网

庞果网的新题目: 题目描述 本题同样来自caopengcs,只要你有兴趣,每个人都可以出题(出题入口在主页右侧边栏“贡献题目”->“我要发布”内),以下是题目详情: 子序列的定义:对于一个序列a...
  • ygrx
  • ygrx
  • 2013-09-18 15:39
  • 3716

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

庞果网在线编程之数组排序ruby解答

题目地址:http://hero.pongo.cn/Question/Details?ID=94&ExamID=92 这个问题有些头疼,主要是不知到是否需要通过递归比较等找出每一种走法后再找出步数...

庞果网回文数问题ruby解答

题目地址:http://hero.pongo.cn/Question/Details?ID=72&ExamID=70 题目详情 回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写...

庞果网直方图中面积最大问题ruby解答

题目地址:http://hero.pongo.cn/Question/Details?ID=58&ExamID=56 题目详情 给定直方图,每一小块的height由...

庞果网 在线编程 24点游戏

“24点游戏是一种使用扑克牌来进行的益智类游戏,游戏内容是:从一副扑克牌中抽去大小王剩下52张,任意抽取4张牌,把牌面上的数(A代表1)运用加、减、乘、除和括号进行运算得出24。每张牌都必须使用一次,...

倒水问题---庞果网

还是庞果网,今天和他杠上了,倒水问题。 题目详情 有两个容器,容积分别为A升和B升,有无限多的水,现在需要C升水。 我们还有一个足够大的水缸,足够容纳C升水。起初它是...
  • ygrx
  • ygrx
  • 2013-07-24 14:53
  • 2884

关于庞果网数组排序的问题

昨天在庞果网看了个题目,难度只有两星(最高为五星),看似简单,120分钟内却没有做出来,深受打击!想了一晚上,终于感觉能给出个可用的算法了。题目如下:   题目并不要求排序, 只是让求出如果排序最少需...

庞果网 —在线编程 —单词博弈 — 特殊解法

英雄会第一届在线编程大赛:单词博弈  15 奖 剩余时间:9天12小时4分37秒 编程语言:C C++ Java C# 答题时长:120 分钟│难度等级: ...

【庞果网英雄会】4月第4次面试集训#字符串#:字符串匹配问题

题目详情 字符串匹配问题,给定一串字符串,按照指定规则对其进行匹配,并将匹配的结果保存至output数组中,多个匹配项用空格间隔,最后一个不需要空格。 要求: 匹配规则中包含...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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