首页 > 其他分享 >虾皮9.14笔试

虾皮9.14笔试

时间:2024-09-14 17:50:30浏览次数:12  
标签:dp2 dp1 int max 9.14 笔试 vector 虾皮 dp

三道都是简化的板子题

第一题

给出每个位置的过路费,求从左上角到右下角的最小花费是多少。
只允许往下或者往右走。
数据范围只有100直接暴力搜索即可。

int minPathSum(vector<vector<int> >& grid) {  
    int m = grid.size();  
    int n = grid[0].size();  
    int res = 1e8 + 5;  
    vector<vector<int>> dir = {{0,1},{1,0}};  
    function<void(int, int, int)> dfs = [&](int x, int y, int now) {  
        if (x == m - 1 && y == n - 1) {  
            res = min(res, now);  
            return ;  
        }  
        for (int i = 0; i < 2; i++) {  
            int xx = x + dir[i][0];  
            int yy = y + dir[i][1];  
            if (xx < 0 || xx >= m || yy < 0 || yy >= n) continue;  
            dfs(xx, yy, now + grid[xx][yy]);  
        }  
    };  
    dfs(0,0,grid[0][0]);  
    return res;  
}

第二题

给出零钱和对应的商品列表,如何尽量花掉这些零钱
也就是体积和价值相同的01背包问题。

int pickGoods(vector<int>& goods_list, int balance) {  
    //体积与价值相同  
    int n = goods_list.size();  
    vector<vector<int>> dp(n + 1, vector<int>(balance + 1, 0));  
    for (int i = 0; i < n; i++) {  
        //dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - goods_list[i]]);  
        //由于对应只选择一次,需要倒序获取  
        for (int j = balance; j >= goods_list[i]; j--) {  
            dp[i + 1][j] = max(dp[i][j], dp[i][j - goods_list[i]] + goods_list[i]);  
        }  
    }  
    return dp[n][balance];  
}

第三题

给出摆动队列的定义是数组中数字大小变化是波浪形。要求数组中能获得的最长摆动子数组长度为多少。
给出的数据范围是1000,直接使用两个数组分别维护以i为开始往上摆动或者往下摆动的长度。
遍历i之后的所有位置进行状态转移,时间复杂度为\(O(n^2)\)

int wiggleMaxLength(vector<int> nums, int numsLen) {  
    // 维护每个数字后面第一个比它大的数字或者比它小的下标  
    int n = numsLen;  
    vector<int> dp1(n + 1, 1);//后面更大  
    vector<int> dp2(n + 1, 1);  
    for (int i = n - 1; i >= 0; i--) {  
        for (int j = i + 1; j < n; j++) {  
            if (nums[j] > nums[i]) dp1[i] = max(dp1[i], dp2[j] + 1);  
            else if (nums[j] < nums[i]) dp2[i] = max(dp2[i], dp1[j] + 1);  
            else {  
                dp1[i] = max(dp1[i], dp1[j]);  
                dp2[i] = max(dp2[i], dp2[j]);  
            }  
        }  
    }  
    int ans = 0;  
    for (int i = 0; i < n; i++) {  
        ans = max(ans, dp1[i]);  
        ans = max(ans, dp2[i]);  
    }  
    return ans;  
}

标签:dp2,dp1,int,max,9.14,笔试,vector,虾皮,dp
From: https://www.cnblogs.com/tanch25/p/18414434

相关文章

  • 京东9.14笔试
    被美团挂的第二天早上神志不清,第三题写错了距离计算函数,人麻了第一题将数组划分成两个区间,要求区间和乘积最小。经典的前缀和+枚举即完成#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+5;inth[N];intmain(){intn;cin>>n;......
  • 滴滴9.13笔试
    难度不大,第二题的\(O(n)\)带有一点思维第一题滑动窗口板子题:求和不超过m的最大区间长度#include<bits/stdc++.h>usingnamespacestd;intmain(){intn;longlongm;cin>>n>>m;vector<int>nums;for(inti=0;i<n;i++)......
  • 笔试常用api
    常用apiArrayList:List接口publicbooleanadd(Ee):将指定的元素添加到此集合的尾部。publicbooleanaddAll(collection对象):将collection的对象加入到publicEremove(intindex):移除此集合中指定位置上的元素。返回被删除的元素。publicEget(intindex):返回此集......
  • 美团笔试2024秋1
    1、图染色法在编译原理中,寄存器分配是代码优化阶段的一项重要任务。寄存器分配的目标是为了有效地将程序中的活跃变量映射到有限数量的处理器寄存器上。在这个过程中,图染色法是一种常用的技术,它通过构建一个冲突图(其中节点代表活跃变量,边代表不能同时分配到同一寄存器的变量对......
  • 9.14 模拟赛
    A.矩形小C有一个\(n\timesn\)的矩阵,每个格子有一个颜色\(a_{i,j}\len\)。给定\(k\),你需要计算出对于所有格子,以这个格子为左上角的最大正方形,满足内部颜色数量不超过\(k\)。\(n\le500\)。枚举左上角\(i,j\),二分正方形的边长,然后用\(|a|\)的复杂度求这个正......
  • 2024.09.14模拟赛总结
    $T1$似乎是签到题,但是没开$unsigned$$long$$long$挂成$88$分了。直接模拟即可,从后往前考虑,将每个数放到离其最近的位置,不过不会证...#include<bits/stdc++.h>usingnamespacestd;typedefunsignedlonglongLL;constintN=1000010;structwasd......
  • 2024.9.14
    1.如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。2.访问数组中的元素是常数时间操作,或说O(1)操作。一个算法如果能在每个步骤去掉一半数据元素,如二分检索,通常它就取O(logn)时间。用strc......
  • Java笔试面试题AI答之单元测试JUnit(4)
    文章目录19.简述JUnitorg.junit.TestSuite类的作用?1.组织测试类2.简化测试执行3.灵活配置测试环境4.嵌套测试套件注意事项20.在JUnit中@Test注释的作用和用法?作用用法21.简述Junit基础注解(@BeforeClass、@Before、@Test、@After、@AfterClass)?22.编写代......
  • 【秋招笔试】9.11得物秋招(已改编)-太难了!!!
    ......
  • 【秋招笔试】9.09阿里国际秋招(已改编)-三语言题解
    ......