得物笔试AK

T1 100%

T2 100%

前两个都是模拟,没啥说的。

T3 100%

跳跃游戏,有n+1个点,从0跳到n。有四种跳跃方式(跳一格、两个、三个、四个),逐一选择,全都选完一遍后会刷新。跳跃点上有金币,不能让自己金币为负数。

常规DP解决。

        for(int i = 1; i <= n; i++) a[i] = in.nextLong();
        long[][] dp = new long[n+1][15];
        for(int i = 0; i <= n; i++) for(int j = 0; j < 15; j++) dp[i][j] = -1;
        dp[0][0] = 0;
        for(int i = 1; i <= n; i++){
            for(int j = 0; j < 15; j++){
                for(int l = 0; l < 4; l++){
                    if((j & (1 << l)) == 0){
                        // 0和15等价
                        int p = (j + (1 << l)) == 15 ? 0 : (j + (1 << l));
                        if(i - (l + 1) >= 0 && dp[i-(l+1)][p] != -1){
                            dp[i][j] = Math.max(dp[i][j], a[i] + dp[i-(l+1)][p]);
                        }
                    }
                }
            }
        }
        for(int i = 0; i < 15; i++) res = Math.max(res, dp[n][i]);
        System.out.println(res);

写的第一版代码不是DP,因为习惯DFS+cache的写法,但是下面代码好像有问题,从0位置开始,没法知道后续选择是否成立。还得从n开始,map里面放的是前面位置的元素(和dp一样)

    public long dfs(int ind, int p, long cur){
        if(ind == n) return 0;
        int key = ((ind << 10) | p);
        if(mp.containsKey(key)) return mp.get(key);
        long ans = -1;
        for(int i = 1; i <= 4; i++){
            if((p & (1 << i)) != 0 && (ind + i) <= n){
                int nind = ind + i;
                int np = (p - (1 << i)) == 0 ? 30 : (p - (1 << i));
                long ncur = cur + a[ind + i];
                // long cans = dfs(nind, np, ncur);
                if(dfs(nind, np, ncur) != -1){
                    ans = Math.max(ans, a[ind + i] + dfs(nind, np, ncur));
                }
            }
        }
        mp.put(key, ans);
        return ans;
    }

全部评论
得物一般笔完多久给面呀?请问
点赞 回复 分享
发布于 2025-04-19 21:50 湖南
ak 了也会被面试放鸽子
点赞 回复 分享
发布于 2025-04-10 15:31 广东
是后端吗,3月15号投的,给我转到数据分析岗了
点赞 回复 分享
发布于 2025-04-09 15:23 四川
woc 得物怎么没给我发笔试
点赞 回复 分享
发布于 2025-04-08 23:00 北京

相关推荐

04-23 21:07
门头沟学院 Java
2026.4.23软件测评只能说从来没做过这么难的编程题,第一题做完后就崩溃了没想到银行会考这么难的题目,春招是不是不想招人啊。我让claude评价一下结果是这样:整体难度评价说实话,这套题对于银行笔试来说属于偏难甚至恶意的级别。一般银行笔试以简单数据结构、排序、字符串为主,但这套题混入了数论(题2)、递归计数(题3)、组合数学(题4)、区间DP(题5),放互联网大厂笔试里也是中等偏难的水准。正常发挥做出3题已经很不错了。题目内容大概如下:第一题是给一个小写字母和数字,判断小写字母往后数给定数字个后的小写字母(循环)第二题考的是倒水问题:一共有两个桶能装水,容量为m、n,每次只能操作一次:装满水;倒空水,或者互相倒水一直到一个空或者一个满,给你一个数k,问能不能通过有限次操作使得两个桶容量和为k。第三题:是分解问题,一个数k,将其分成k/2向下取整和向上取整两种部分,只能这样分,求最终分成的部分数一共有多少个,比如14可以分成14、7、3、4、2、1,6这些部分数,这一题我想用递归,但是不知道奇数情况下怎么递归。第四题:给你一个由r、e、d三种字符组成的字符串,求满足:连续子串不能出现red,不连续子串(保持相对顺序)出现red的满足条件的重排列序列个数,这个我完全不会。第五题:给你一个序列a,序列a中每个数能够+1或者-1,分别对应一个消耗数组b和c,要求使得序列所有相邻元素均不相等的最小消耗。
在干饭的牛油很讲道理:点开就傻眼了
查看5道真题和解析
点赞 评论 收藏
分享
评论
1
4
分享

创作者周榜

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