10.16 腾讯笔试求解

10.16 腾讯笔试求解

知道是海笔全当练手,然而最难受的是练完手看不到正解QAQ

求问下题AC思路:

原题描述:

小Q来到了一个级台阶前。已知小Q的左脚每次可以迈奇数级台阶,右脚每次可以迈偶数级台阶(不能是0)他准备用左、右***替的方式进行跳台阶:即除了第一步可以
随意选择以外,后面的每一步的奇偶性一定和前一步不同。小Q想知道,自己跳上这阶台阶,共有多少种不同的方式?

TLE代码(72%):

    def func5(self):
        n = int(input())
        dp = [[0] * (2) for _ in range(n+1)]
        dp[1][0], dp[1][1] = 1, 0
        dp[2][0], dp[2][1] = 0, 1
        for i in range(3, n+1):
            for j in range(1, i):
                if((i-j) % 2 == 1):
                    dp[i][0] += dp[j][1]
                else:
                    dp[i][1] += dp[j][0]
            if i % 2 == 0:
                dp[i][1] += 1
            else: dp[i][0] += 1
        print(sum(dp[n]))
        return
#腾讯笔试#
全部评论
https://www.nowcoder.com/discuss/1078573
1 回复 分享
发布于 2022-10-17 17:03 天津
通过率 72% 应该是超时了。 文字可能讲不明白,先看图吧。 在计算 14 的奇 dp 值时,要求黑线所指的和,求 12 的奇 dp 值时,求的是红线所指的和。可以发现其中绝大多数操作是重复的,红箭头所指的和就是 12 的奇 dp 值(如果不是 12 而是某个奇数则是 dp 值减一)。因此我们可以把求奇 dp 的操作优化为下面的操作(如果 x 是奇数则结果要减一),求偶 dp 也有类似的关系。这样就把时间复杂度从 O(n^2) 优化为了 O(n)。
1 回复 分享
发布于 2022-10-17 16:41 湖北
最终100%+100%+100%+100%+72.73%,难度中等,需要考虑的细节较多。 1. 直接把链表转为字符串进行处理,然后把结果再转为链表。多试几次运气好能AC. 2. 哈希+打表。因为a_i <= 10^9 < 2^100,出现的任何数字的二进制都不会超过100个1,故将不超过100的正整数以及所有a_i的转换增益进行从大到小的排序。对输入数组a[]哈希,然后找增益尽量大的数进行操作,操作k次后即得到答案。用堆可以进一步优化时间,但没必要。 3. 因为商品数量n<=12,可以直接DFS. 每种商品有3种情况:原价买、打折买和不买,故解空间不超过3^12,再加上剪枝,时间完全够用。 4. 写得很花哨,其实很多障眼法。奇数轮弹出较小数,偶数轮弹出较大数即可AC. 5. 动归,但是超时间。只能算出n<=1000的情况。
点赞 回复 分享
发布于 2022-10-23 17:54 上海
其实可以做的,我是c++,这么做过了,可能是语言的问题
点赞 回复 分享
发布于 2022-10-22 09:32 广西
for (a+b+k)%i==0 。i减小,需要计算i的初始值,并跳过不成立的i,这样就能做。
点赞 回复 分享
发布于 2022-10-17 17:52 四川
大佬可以分享下其他题目的ac题解嘛?菜鸡学习下
点赞 回复 分享
发布于 2022-10-17 13:43 陕西

相关推荐

昨天 20:46
武汉大学 Java
点赞 评论 收藏
分享
评论
4
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务