庞果网的新题目:

题目描述


本题同样来自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的结果即可)

算法描述


刚开始的时候我总想着直接去算排列组合,然后根据容斥原理把重复的去掉,从而得到结果,后来发现这样不是不行,要考虑的东西实在是太多了,编程起来非常麻烦。放弃了。

后来休息了一天,再看的时候换了一个思路,仔细分析了一下题目,按照递推关系,找到一个比较靠谱的思路。

设 f(k)为k长度的序列的子序列个数,那么很显然有以下推论:

  • f(k)的个数包括f(k-1)的个数,因为f(k-1)的每一个都是f(k)的子序列,然后把f(k-1)的每个序列和a[k]组合起来,这些序列也是f(k)的子序列,个数还是f(k-1),载加上单独的a[k],那么

f(k)=2*f(k-1)+1

  • 上面这个表达式是当a[k]和前面的数都不同的时候的情况,如果a[k]在前面出现过的话,那f(k)的个数除了上面那些的话:

    • 还需要减去最近一次出现a[k]这个数值的地方-1的子序列个数,因为这些算重复了
    • +1也没有了,因为f(a[k]上次出现的位置)包括了a[k]单独算一次的情况

f(k)=2*f(k-1)-f(a[k]上次出现的位置-1)

有了这两个表达式,就是一个完整的递推关系了,a[k]上次出现的位置的保存,可以用一个hash表来存储,这样速度很快,但是题目说a[k]的范围是0到220,那可以用一个220的数组来存储,反正也不会溢出,省得用hash了。

代码比较简单,具体的可以上github上看

subArray[0]=0;
for(int i=1;i<=n;i++){if(lastSameIndex[a[i-1]] == 0 ){subArray[i]=(subArray[i-1]*2)+1;         }else {subArray[i]=((subArray[i-1]*2)-subArray[lastSameIndex[a[i-1]]-1]);}lastSameIndex[a[i-1]]=i; }

子序列的个数 --- 庞果网相关推荐

  1. 庞果网之建立信号基站

    题目详情 要建立一个信号基站服务n个村庄,这n个村庄用平面上的n个点表示.假设基站建立的位置在(X,Y),则它对某个村庄(x,y)的距离为max{|X – x|, |Y – y|}, 其中| |表示绝 ...

  2. 庞果网之杨辉三角的变形

    题目详情 1 1   1  1 1  2   3  2  1 1  3  6   7  6  3  1 以上三角形的数阵,第一行只有一个数1, 以下每行的每个数,是恰好是它上面的数,左上的数和右上数等 ...

  3. 庞果网之字符串的完美度

    题目详情 我们要给每个字母配一个1-26之间的整数,具体怎么分配由你决定,但不同字母的完美度不同, 而一个字符串的完美度等于它里面所有字母的完美度之和,且不在乎字母大小写,也就是说字母F和f的完美度是 ...

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

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

  5. 回文字符串——庞果网

    题目依旧是来自庞果网. 题目详情: 回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串. 输入:非空仅由小写字母组成的字 ...

  6. 庞果网练习题——魔法

    庞果网练习题--魔法 自己做着玩的,欢迎指正.指点.一起讨论. 题目详情 你拥有3种魔法,可以用第一种魔法把 a 克的沙子变成 b 克金属,可以用第二种魔法把 c 克金属变成 d 克金子,可以用第三种 ...

  7. 庞果网之寻找直方图中面积最大的矩形

    题目详情 给定直方图,每一小块的height由N个非负整数所确定,每一小块的width都为1,请找出直方图中面积最大的矩形. 如下图所示,直方图中每一块的宽度都是1,每一块给定的高度分别是[2,1,5 ...

  8. 人才招聘新趋势:垂直性的社交网络——pongo网(庞果网)CEO李炯明专访

    记者 / 长卿 近日,国内专业IT人才招聘服务公司Careerfocus联合全球最大中文IT社区CSDN推出了IT行业细分的招聘求职网站pongo(庞果网),力图通过搜索引擎,垂直型社交网络构建IT行 ...

  9. 庞果网---字符串消除

    题目: 给定一个字符串,仅由a,b,c 3种小写字母组成.当出现连续两个不同的字母时,你可以用另外一个字母替换它,如 有ab或ba连续出现,你把它们替换为字母c: 有ac或ca连续出现时,你可以把它们 ...

  10. 庞果网 英雄会 最小公倍数

    import java.io.BufferedInputStream; import java.util.LinkedList; import java.util.Scanner;/*** @auth ...

最新文章

  1. 使用beanutil简化request值的接收
  2. debug —— C语言 编译时候进行debug的调试
  3. 使用xUnit为.net core程序进行单元测试(3)
  4. 什么是python语言的动态类型机制_理解Python的Dynamic typing
  5. 提高性能:流的非阻塞处理
  6. 将旧项目从Ant迁移到Maven的4个简单步骤
  7. java concurrent包介绍及使用
  8. 排序算法 —— 计数排序
  9. Possible iteration over unexpected (custom / inherited) members, probably missing hasOwnProperty che
  10. 计算机等级考试考卷试题按钮,全国计算机等级考试一级B模拟试题及答案2011.7...
  11. Batch Normalization批量归一化
  12. 盘点《令人心动的offer》中让人敲黑板的重点
  13. [iOS]在tableview中用动画效果改变cell的高度
  14. 12864液晶显示c语言程序,单片机+lcd12864液晶万年历C程序
  15. Unity3D 制作绿草地,草坪,模型表面生成草地,草地效果Shader实现 草着色器 Brute Force - Grass Shader
  16. (含代码)基于51最小系统的流水灯+焊接制作
  17. 网络精英赛模拟练习(8)
  18. 仿绚丽彩虹播放器程序源码
  19. 第五周 项目二 建立链栈算法库
  20. 小新想把百度搜索引擎改为edge

热门文章

  1. SilverLight学习
  2. JBPM开发入门指南(3)
  3. flex2.0 asp.net
  4. 工程实践中最常用的10大数据结构与算法讲解
  5. cat(MATLAB
  6. matlab中结构体使用方法
  7. 苹果电脑取色器怎么用?Mac取色器——为你的设计提提速
  8. macOS Monterey更新后遇到的bug问题汇总与解决
  9. VEGAS如何分割与解组?
  10. 在原生js中的,table表格,display:block之后,样式混乱