小蓝制作了一个机器人,取名为蓝跳跳,因为这个机器人走路的时候基本靠跳跃。
蓝跳跳可以跳着走,也可以掉头。蓝跳跳每步跳的距离都必须是整数,每步可以跳不超过 k 的长度。由于蓝跳跳的平衡性设计得不太好,如果连续两次都是跳跃,而且两次跳跃的距离都至少是 p,则蓝跳跳会摔倒,这是小蓝不愿意看到的。
小蓝接到一个特别的任务,要在一个长为 L 舞台上展示蓝跳跳。小蓝要控制蓝跳跳从舞台的左边走到右边,然后掉头,然后从右边走到左边,然后掉头,然后再从左边走到右边,然后掉头,再从右边走到左边,然后掉头,如此往复。为了让观者不至于太无趣,小蓝决定让蓝跳跳每次用不同的方式来走。小蓝将蓝跳跳每一步跳的距离记录下来,按顺序排成一列,显然这一列数每个都不超过 k 且和是 L。这样走一趟就会出来一列数。如果两列数的长度不同,或者两列数中存在一个位置数值不同,就认为是不同的方案。
请问蓝跳跳在不摔倒的前提下,有多少种不同的方案从舞台一边走到另一边。
【输入格式】
输入一行包含三个整数 k, p, L。
【输出格式】
输出一个整数,表示答案。答案可能很大,请输出答案除以 20201114 的余数。
【样例输入】
3 2 5
【样例输出】
9
【样例说明】
蓝跳跳有以下 9 种跳法:
1+1+1+1+1
1+1+1+2
1+1+2+1
1+2+1+1
2+1+1+1
2+1+2
1+1+3
1+3+1
3+1+1
【样例输入】
5 3 10
【样例输出】
397
这种题可以用递归的DFS解也可以用动态规划,相比较经典的递归走台阶问题,由于题目没有限定第一步跳的种类,所有导致有多种方法。递归之后也是无法求解递归无法求解的题目。因为重复计算。计算规模o(L的k次方),所以采用了动态规划+递推做的此题,我们可以建立一个2维数组dp[i][j] 。
i 表示舞台距离,j表示第一次跳j格时。 dp[i][j]表示我当前步数用j步走 可以多少种方法走到i。
p意思就是连续跳大于等于p时就会摔倒。
d[i][j]i跳数的取值范围0-K
j的取值范围是0-L
规律描述:当舞台长度为1时,我第一步为1时dp[1][1]=1 种方法 当第一步为2时 d[1][2]=0种。当第一步为3时dp[1][3]=0种。
当舞台长度为2时,我第一步为1时dp[2][1]=1种方法 当第一步为2时dp[2][2]=1种。当第一步为3时dp[2][3]=0种.
当我们得到长度为2 第一步为1时, 我当前的长度减1 剩余舞台长度为1,我们可以看到舞台为1的时候一共只有1种方法那么当长度为dp[1][1]+dp[1][2]+dp[1][3]=dp[2][1]=1 第一步为1时就是一种方法。因为当跳的步数和长度相等的时候只有一种方法 dp[2][2]=1。
如果连续两次都是跳跃,而且两次跳跃的距离都至少是 p,我们知道j是第一种跳法,k就是第2个选择的跳法所以 j>=b 分为二种转移方程,
当j>=b , 说明我们第一次跳了大于p的距离如果我们第二次在大于p那么蓝跳跳将会摔倒所以我们dp[4][2]+=dp[2][1] 不可以选择dp[2][2]和dp[2][3]
那么转移方程得:dp[i][j]+=dp[i-j][k]
当第一次小于p的长度,我们第二次就把所有可能选择上dp[4][1]=dp[3][1]+dp[3][2]+dp[3][3]
那么转移方程得:dp[i][j]+=sum(dp[i-j])。
但是这种不是最优解最多跑80%的数据。
创建一个双层的循环数组,0层存j<b的方式个数,1层存b<p+1方式个数。和上面方法差不多只不过是以双层的格式存储,这样可以少很多的计算量。
我们先把已知的数据写入二维数据中dp[1][0]=1,然后遍历2,s+1和1,p+1,因为当s=0时 方法只有一种。把dp[0][1]=1 或者dp[0][0]=1 我只是把这个当上面方法dp[i][j]+=1用了。
这个转移方程也是2个,一个 (1,b) 和(b,p+1) 把j<b 存在dp[i][0] b<p+1存在dp[i][1]。
转移方程分别为 dp[i][0]+=dp[i-j][1]+dp[i-j][0], dp[i][1]+=dp[i-j][0]。
这种就可以把数据跑完了计算量把上个方法少了很多。
1、average_sum函数的功能为求一批数中大于平均值sum=0k=0for i in range(n): sum=sum+a[i]average=sum/nfor i in range: if(a[i]>average):k=k+a[i]return k2、编写函数fun求一个不多于五位数的正整数的位数if(m>9999): place=5elif(m>999): place=4elif(m>99): place=3elif(m>9): place=2else: place=1return place3、请编fun函数,求4*4整形数组的主对角线元素的和sum=0.0for i in range(4): sum+=a[i][i]return sum4、已知:一元钱一瓶汽水,喝完后两个空瓶换一瓶汽水。问:请输入钱数(大于1的正整数),则根据钱数最多可以喝到几瓶汽水。s=0k=0while m>0: m=m-1 s=s+1 k=k+1 while k>=2:k=k-2s=s+1k=k+1return s5、编写函数fun(x,y),函数的功能是若x、y为奇数,求x到y之间的奇数和;若x、y为偶数,则求x到y之间的偶数和。要求必须使用for结构。 主函数的功能是分别计算如下的值: (1+3+5+……+777)+(2+4+6+……+888)=??? (1+3+5+……+1111)+(2+4+6+……+2222)=???(1+3+5+……+1999)+(2+4+6+……+1998)=???s=0for i in range(x,y+1,2): s=s+ireturn s6、编写函数main 求3!+6!+9!+12!+15!+18!+21!s=0for i in range(3,22,3): r=1 for j in range(1,i+1):r*=j s+=rprint(s)这是一位有着五年 Python 经验的好友最近对 Python 岗位面试后的一篇经验总结,从 Python 就业方向到 Python 面试题。
Python 就业方向 :
下面是 Python 面试知识点,总结了华为、阿里巴巴等互联网公司 Python 常问面试题。每道题都提供参考答案,希望能够帮助你在求职面试中脱颖而出,找到一份高薪工作。
这些面试题分为 Python 基础和 Python高级,内容包含: 基础语法、文件操作、模块与包、数据类型、元类、内存管理与垃圾回收机制以及 Python 函数 等知识点。
(一) Python 基础语法
(二) 文件操作
(三) 模块与包
(四) 数据类型
(五)企业面试题
(一) 元类
(二)内存管理与垃圾回收机制
(三)函数
(四) 面向对象
由于篇幅有限,这份 Python 面试宝典已经被整理成了PDF文档,有需要 Python 面试宝典全套完整文档(面试题+答案解析)的可以 免费领取!