题目地址: http://hero.pongo.cn/Question/Details?ID=111&ExamID=109
题目详情
这个题目前一阵子就看过了,很长时间都没有思路。 想到 应该如何递归呢。首先想到的是按照人的计算思路来计算。
总个数 = 大小为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