子序列的个数 --- 庞果网
庞果网的新题目:
题目描述
本题同样来自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; }
子序列的个数 --- 庞果网相关推荐
- 庞果网之建立信号基站
题目详情 要建立一个信号基站服务n个村庄,这n个村庄用平面上的n个点表示.假设基站建立的位置在(X,Y),则它对某个村庄(x,y)的距离为max{|X – x|, |Y – y|}, 其中| |表示绝 ...
- 庞果网之杨辉三角的变形
题目详情 1 1 1 1 1 2 3 2 1 1 3 6 7 6 3 1 以上三角形的数阵,第一行只有一个数1, 以下每行的每个数,是恰好是它上面的数,左上的数和右上数等 ...
- 庞果网之字符串的完美度
题目详情 我们要给每个字母配一个1-26之间的整数,具体怎么分配由你决定,但不同字母的完美度不同, 而一个字符串的完美度等于它里面所有字母的完美度之和,且不在乎字母大小写,也就是说字母F和f的完美度是 ...
- 关于庞果网数组排序的问题
昨天在庞果网看了个题目,难度只有两星(最高为五星),看似简单,120分钟内却没有做出来,深受打击!想了一晚上,终于感觉能给出个可用的算法了.题目如下: 题目并不要求排序, 只是让求出如果排序最少需 ...
- 回文字符串——庞果网
题目依旧是来自庞果网. 题目详情: 回文字符串是指从左到右和从右到左相同的字符串,现给定一个仅由小写字母组成的字符串,你可以把它的字母重新排列,以形成不同的回文字符串. 输入:非空仅由小写字母组成的字 ...
- 庞果网练习题——魔法
庞果网练习题--魔法 自己做着玩的,欢迎指正.指点.一起讨论. 题目详情 你拥有3种魔法,可以用第一种魔法把 a 克的沙子变成 b 克金属,可以用第二种魔法把 c 克金属变成 d 克金子,可以用第三种 ...
- 庞果网之寻找直方图中面积最大的矩形
题目详情 给定直方图,每一小块的height由N个非负整数所确定,每一小块的width都为1,请找出直方图中面积最大的矩形. 如下图所示,直方图中每一块的宽度都是1,每一块给定的高度分别是[2,1,5 ...
- 人才招聘新趋势:垂直性的社交网络——pongo网(庞果网)CEO李炯明专访
记者 / 长卿 近日,国内专业IT人才招聘服务公司Careerfocus联合全球最大中文IT社区CSDN推出了IT行业细分的招聘求职网站pongo(庞果网),力图通过搜索引擎,垂直型社交网络构建IT行 ...
- 庞果网---字符串消除
题目: 给定一个字符串,仅由a,b,c 3种小写字母组成.当出现连续两个不同的字母时,你可以用另外一个字母替换它,如 有ab或ba连续出现,你把它们替换为字母c: 有ac或ca连续出现时,你可以把它们 ...
- 庞果网 英雄会 最小公倍数
import java.io.BufferedInputStream; import java.util.LinkedList; import java.util.Scanner;/*** @auth ...
最新文章
- 使用beanutil简化request值的接收
- debug —— C语言 编译时候进行debug的调试
- 使用xUnit为.net core程序进行单元测试(3)
- 什么是python语言的动态类型机制_理解Python的Dynamic typing
- 提高性能:流的非阻塞处理
- 将旧项目从Ant迁移到Maven的4个简单步骤
- java concurrent包介绍及使用
- 排序算法 —— 计数排序
- Possible iteration over unexpected (custom / inherited) members, probably missing hasOwnProperty che
- 计算机等级考试考卷试题按钮,全国计算机等级考试一级B模拟试题及答案2011.7...
- Batch Normalization批量归一化
- 盘点《令人心动的offer》中让人敲黑板的重点
- [iOS]在tableview中用动画效果改变cell的高度
- 12864液晶显示c语言程序,单片机+lcd12864液晶万年历C程序
- Unity3D 制作绿草地,草坪,模型表面生成草地,草地效果Shader实现 草着色器 Brute Force - Grass Shader
- (含代码)基于51最小系统的流水灯+焊接制作
- 网络精英赛模拟练习(8)
- 仿绚丽彩虹播放器程序源码
- 第五周 项目二 建立链栈算法库
- 小新想把百度搜索引擎改为edge