长度

蓝桥杯 算法训练 瓷砖铺放Python实现(递归)

為{幸葍}努か 提交于 2020-02-26 17:38:49
资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述   有一长度为N(1<=N<=10)的地板,给定两种不同瓷砖:一种长度为1,另一种长度为2,数目不限。要将这个长度为N的地板铺满,一共有多少种不同的铺法?   例如,长度为4的地面一共有如下5种铺法:   4=1+1+1+1   4=2+1+1   4=1+2+1   4=1+1+2   4=2+2   编程用递归的方法求解上述问题。 输入格式   只有一个数N,代表地板的长度 输出格式   输出一个数,代表所有不同的瓷砖铺放方法的总数 样例输入 4 样例输出 5 分析: 解决问题的关键是找到递归的公式,我们可以把2的数目看成递归的突破点,4里面最多的2的数目就是2个。 种类的通式如下:(假如是4) 值得注意的是,C(n,k)的计算方法: AC代码: while True : try : n = int ( input ( ) ) if n == 1 : print ( 1 ) break def mul ( a ) : #阶乘函数 ans = 1 for i in range ( 1 , a + 1 ) : ans *= i return ans def Rec ( n , k ) : if n == k : return 2 #一开始和最后都是1 else : return mul ( n ) // ( mul

相似基因(线性dp)

风格不统一 提交于 2020-02-26 12:57:49
首先回顾一下最长公共序列: c[i][j]表示长度为i的序列与长度为j的序列的最长公共序列长度; 上题目!!!!! 题目背景 大家都知道,基因可以看作一个碱基对序列。它包含了 44 4种核苷酸,简记作 A,C,G,TA,C,G,T A , C , G , T。生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物。 在一个人类基因工作组的任务中,生物学家研究的是:两个基因的相似程度。因为这个研究对疾病的治疗有着非同寻常的作用。 题目描述 两个基因的相似度的计算方法如下: 对于两个已知基因,例如 AGTGATGAGTGATG A G T G A T G和 GTTAGGTTAG G T T A G,将它们的碱基互相对应。当然,中间可以加入一些空碱基-,例如: 这样,两个基因之间的相似度就可以用碱基之间相似度的总和来描述,碱基之间的相似度如下表所示: 那么相似度就是: (−3)+5+5+(−2)+(−3)+5+(−3)+5=9(-3)+5+5+(-2)+(-3)+5+(-3)+5=9 ( − 3 ) + 5 + 5 + ( − 2 ) + ( − 3 ) + 5 + ( − 3 ) + 5 = 9。因为两个基因的对应方法不唯一,例如又有: 相似度为: (−3)+5+5+(−2)+5+(−1)+5=14(-3)+5+5+(-2)+5+(-1)+5=14 ( − 3 ) + 5 +

平面向量学习笔记

∥☆過路亽.° 提交于 2020-02-26 11:58:16
平面向量学习笔记 第一节 一、向量的背景——位移、速度、力 1、特点:向量、位移、力都既有大小、又有方向。 2、既有大小、又有方向的量在物理上成为矢量。 二、向量及其表示 1、概念:既有大小、又有方向的量统称为向量。其中,大小与方向是向量的二要素。 2、表示方法: (1)几何表示——有向线段 若规定线段 \(AB\) 端点 \(A\) 为起点,端点 \(B\) 为终点,则线段 \(AB\) 就有了从起点 \(A\) 到终点 \(B\) 的方向和长度。这种具有方向和长度的线段叫做有向线段,记作 $ \overrightarrow {AB} \(,其长度为\) |\overrightarrow {AB}| $。 此时,有向线段表示向量,有向线段的长度表示向量的大小,有向线段箭头所指方向表示向量的方向。 (2)字母表示 ​ ①用有向线段的起点和终点表示$ \overrightarrow {AB} $。 ​ ②用小写字母 \(a,b,c...\) 表示,书写表示为$ \overrightarrow {a},\overrightarrow {b},\overrightarrow {c}... $ 3、向量的模 \(|\overrightarrow {AB}|\) (或 \(|{a}|\) )表示 \(\overrightarrow {AB}\) (或 \({a}\) )的大小,即长度(或模)

哈夫曼树与带权路径长度

爷,独闯天下 提交于 2020-02-19 04:05:11
哈夫曼树与带权路径长度 问题: 权值分别为从19,21,2,3,6,7,10,32的结点,构造一棵哈夫曼树,该树的带权路径长度是? 构建哈夫曼树: 1.从19,21,2,3,6,7,10,32之中选取连个最小的2,3。 2.从19,21,5,6,7,10,32之中选取连个最小的5、6。 3.从19,21,11,7,10,32之中选取连个最小的7、10。 4.从19,21,11,17,32之中选取连个最小的11、17。 5.从19,21,28,32之中选取连个最小的19、21。 6.从40,28,32之中选取连个最小的28、32。 7.最后,哈夫曼树建成。 8.计算带权路径长度: 结点的带权路径长度=从根结点到该结点之间的路径长度 X 该结点的权。 来源: CSDN 作者: xwq9797 链接: https://blog.csdn.net/qq_35456686/article/details/104376041

不修改数组找出重复的数字

北慕城南 提交于 2020-02-16 21:23:46
不修改数组找出重复的数字 给定一个长度为 n+1 的数组nums,数组中所有的数均在 1∼n 的范围内,其中 n≥1。 请找出数组中任意一个重复的数,但不能修改输入的数组。 样例 给定 nums = [ 2 , 3 , 5 , 4 , 3 , 2 , 6 , 7 ] 。 返回 2 或 3 。 思考题:如果只能使用 O(1) 的额外空间,该怎么做呢? 暴力做法在此不做叙述,这里讲述空间复杂度O(1) 的做法 此题运用抽屉原理 用在这个题目中就是,一共有 n+1 个数,每个数的取值范围是1到n,所以至少会有一个数出现两次。 然后我们采用分治的思想,将每个数的取值的区间[1, n]划分成[1, n/2]和[n/2+1, n]两个子区间,然后分别统计两个区间中数的个数。 注意这里的区间是指 数的取值范围,而不是 数组下标。 划分之后,左右两个区间里一定至少存在一个区间,区间中数的个数大于区间长度。 这个可以用反证法来说明:如果两个区间中数的个数都小于等于区间长度,那么整个区间中数的个数就小于等于n,和有n+1个数矛盾。 因此我们可以把问题划归到左右两个子区间中的一个,而且由于区间中数的个数大于区间长度,根据抽屉原理,在这个子区间中一定存在某个数出现了两次。 依次类推,每次我们可以把区间长度缩小一半,直到区间长度为1时,我们就找到了答案。 class Solution { public :

Python day 4

≯℡__Kan透↙ 提交于 2020-02-11 21:20:37
#字符串 1.定义字符串 ’ ’ ‘’ ‘’ ‘’’ ‘’’ “”" “”" 内置函数操作:len() 切片:print(s[0:9]) print(s.count(“天”)) 计数次数 # print(s1.isalpha()) 是否字母 # print(s1.upper().lower()) 大小写 # print(s.replace(“天”,“hi”,1)) 字符串中的 old(旧字符串) 替换成 new(新字符串),如果指定第三个参数max,则替换不超过 max 次 # print(s.join(s1)) 加入 # print(s.strip(’,’)) 移除字符串头尾指定的字符(默认为空格或换行符)或字符序列 # print(s.lstrip(’,’)) 截掉字符串左边的空格或指定字符 # print(s.rstrip(’,’)) 截掉字符串右边的空格或指定字符 # print(s.split(’,’)) 指定分隔符对字符串进行切片,如果参数 num 有指定值,则分隔 num+1 个子字符串 # print(s.encode(“utf-8”)) # print(s.encode(“gbk”)) # print(s.index(“天”)) 从列表中找出某个值第一个匹配项的索引位置。 # print(s.find(“真好”))检测字符串中是否包含子字符串 str ,如果指定

leetcode的golang实现【0003】无重复字符的最长子串

醉酒当歌 提交于 2020-02-05 03:00:44
题目 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。 题解 暴力法 简单来说就是列出字符串中所有的子串 func lengthOfLongestSubstring ( s string ) int { var maxLen int for i := 0 ; i < len ( s ) ; i ++ { for j := i + 1 ; j <= len ( s ) ; j ++ { if isUnique ( s [ i : j ] ) { if len ( s [ i : j ] ) > maxLen { maxLen = len ( s [ i : j ] ) } } else { // 如果该子串重复,继续添加后续字符也还是不重复 break } } } return maxLen } func isUnique ( s string

leetcode题库 最长无重复子串

蹲街弑〆低调 提交于 2020-02-05 01:32:49
leetcode 最长无重复子串 题目: 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。 示例 3: 输入: “pwwkew” 输出: 3 解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。。 解决方法 解法一:暴力法 class Solution { public int lengthOfLongestSubstring ( String s ) { String [ ] str = new String [ s . length ( ) ] ; for ( int i = 0 ; i < s . length ( ) ; i ++ ) { str [ i ] = s . substring ( i , i + 1 ) ; } ArrayList < Integer > list = new ArrayList ( ) ; // 起始指针移动 for ( int i = 0 ; i < str . length ; i ++ ) { //

折半查找判定数及平均查找长度

和自甴很熟 提交于 2020-02-02 14:21:00
折半查找判定数及平均查找长度 折半查找的过程看,可用二叉树来描述,二叉树中的每个结点对应有序表中的一个记录,结点中的值为该记录在表中的位置。通常称这个描述折半查找二叉树的过程称为折半查找判定树。 例如:长度为10的 折半查找 判定树 的具体生成过程: 都遵循这个规律,左孩子结点<根结点<右孩子结点 (1)在长度为10的有序表中进行折半查找,不论查找哪个记录,都必须和中间记录进行比较,而中间记录为 (1+10)/2 =5 (注意要取整) 即判定数的的根结点为5,如图7-2(a)所示。 (2)考虑 判定树 的左子树,即将查找区域调整到左半区,此时的查找区间为[1,4],那么中间值为(1+4)/2 =2 (注意要取整) ,所以做孩子根结点为2,如图7-2(b)所示。 (3)考虑判定树的右子树,即将查找区域调整到右半区,此时的查找区间为[6,10],那么中间值为(6+10)/2 =8 (注意要取整) ,所以做孩子根结点为8,如图7-2(c)所示。 (4)重复以上步骤,依次去确定左右孩子、 1.折半查找是一棵二叉排序树,每个根结点的值都大于左子树的所有结点的值,小于右子树所有结点的值。 2.折半查找判定数中的结点都是查找成功的情况,将每个结点的空指针指向一个实际上不存在的结点————外结点,所有外界点都是查找不成功的情况,如图7-2(e)所示。如果有序表的长度为n,则外结点一定有n+1个