Python技术迷

外包能拿30k以上的,为什么还做外包呢?

听说现在外包可以拿到30k以上?为什么还做外包呢?

Image

首先,我得承认,有些人可能真的试过了找正式员工的工作,但可能遇到了一些“瓶颈”。

在这个竞争激烈的程序员市场里,有些人找工作简直比找女朋友还难。有时候简历投出去,连面试的机会都没有;有时候面试了,面试官看了半天,说你经验不够,或者不符合他们的要求,这就是现实。

然后就是外包的“自由”。虽然外包的工作可能压力大、项目多,但至少在时间安排上有一定的自由度。

Image

而且,外包通常不需要像正式员工那样面对公司内部的复杂人际关系,老板直接给钱,不用像大公司那样受制于层层审批。

不是外包不好,而是找不到正式的工作才逼着去做外包。对于大多数程序员来说,外包不过是一种权宜之计,能拿到手的30k,先干着吧,能有点生活的安逸感,毕竟,赚钱也得活得舒服嘛。【备注:文末可领最新资料】

算法题:摘樱桃

今天我们来聊一个经典的算法题:摘樱桃。

题目背景是这样的:给定一个矩阵,表示一片果园,每个格子里可能有樱桃,或者是空地,或者是障碍。你需要从左上角走到右下角(或者是其他位置),同时摘到最多的樱桃。你只能在格子内上下左右移动,而且有些格子会有障碍物,无法通过。要求的是,优化你摘樱桃的路径,怎么走能摘到最多的樱桃。

这个问题其实是典型的“动态规划”问题。听起来很高大上对吧?其实你可以理解为,通过“记忆”中间状态来减少重复计算。我们一起来一步步推导一下怎么解这个题。

首先,我得定义一个 dp 数组,假设 dp[i][j] 代表从 (i, j) 这个点出发,能够摘到的最多樱桃数量。那么显然,递推公式会跟你周围的格子有关。如果你要从 (i, j) 到达 (i+1, j),那么你必须考虑 (i, j) 这一格的樱桃数,再加上从下方格子可以摘到的樱桃数。

简单来说,就是你得做一个动态规划表,记录每个格子最优解的值。你会从每个格子出发,看看从上面或者从左面来的最大值,看看该位置有多少樱桃,再加上之前的最优解。就像你往每个格子里填一个数字,数字的大小代表这个格子能收集到的樱桃数量。

代码实现

def cherryPickup(grid):
    if not grid:
        return 0

        rows, cols = len(grid), len(grid[0])

        # dp[i][j][k] 表示从 (i, j) 到 (i', j') 的最大樱桃数
    dp = [[[0] * cols for _ in range(cols)] for _ in range(rows)]

        # 从倒数第二行开始填dp数组
    for i in range(rows - 2, -1, -1):
        for j1 in range(cols):
            for j2 in range(cols):
                # 当前格子樱桃数
                cherries = grid[i][j1] + (grid[i][j2] if j1 != j2 else 0)

                                # 从上面来的状态
                max_cherries = 0
                for dj1 in [-1, 0, 1]:
                    for dj2 in [-1, 0, 1]:
                        nj1, nj2 = j1 + dj1, j2 + dj2
                        if 0 <= nj1 < cols and 0 <= nj2 < cols:
                            max_cherries = max(max_cherries, dp[i + 1][nj1][nj2])

                                dp[i][j1][j2] = cherries + max_cherries

        return dp[0][0][cols - 1]

代码解析

  1. dp数组的定义:dp[i][j1][j2] 表示从第 i 行开始,分别从 (i, j1) 和 (i, j2) 位置出发,到达终点时能摘到的最大樱桃数。两个人物从两个不同的位置出发,但最终目标是一个格子。这个状态记录了两个人物都走到这个点时的最大樱桃数。

  2. 递推过程:从倒数第二行开始,我们依次回推每一行,找到当前每个位置的最大樱桃数。为了不重复计算,我们会检查三个方向(上、左、右),并选择最优解。

  3. 边界条件:这题的特殊情况很多,比如碰到障碍物就不能继续移动;另外,如果两个人走到同一个位置,他们就只能摘一次樱桃。dp[i][j1][j2] 记录的就是两个人从当前位置开始时的最优解。

  4. 时间复杂度:由于我们需要遍历每个格子,每个格子的状态要与周围的格子比较,所以时间复杂度是 O(N * M * N * M),其中 N 和 M 是矩阵的行列数。如果矩阵很大,这个解法可能会有些慢。

最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek

也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。

对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
🔥虎哥私藏精品 热门推荐🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。

资料包含了《IDEA视频教程》、《最全python面试题库》、《最全项目实战源码及视频》及《毕业设计系统源码》,总量高达650GB,全部免费领取