Task02:动态规划

这篇博客探讨了动态规划在解决字符串问题中的应用,包括找到最长的回文子串、编辑距离算法以及一系列的打家劫舍问题,如打家劫舍和打家劫舍II。同时,还讨论了如何寻找最长连续递增序列和最长回文子序列的问题。

1.最长回文子串

class Solution:
    def longestPalindrome(self, s: str) -> str:
        n = len(s)
        dp = [[False] * n for _ in range(n)]
        ans = ""
        # 枚举子串的长度 l+1
        for l in range(n):
            # 枚举子串的起始位置 i,这样可以通过 j=i+l 得到子串的结束位置
            for i in range(n):
                j = i + l
                if j >= len(s):
                    break
                if l == 0:
                    dp[i][j] = True
                elif l == 1:
                    dp[i][j] = (s[i] == s[j])
                else:
                    dp[i][j] = (dp[i + 1][j - 1] and s[i] == s[j])
                if dp[i][j] and l + 1 > len(ans):
                    ans = s[i:j+1]
        return ans
  1. 编辑距离
class Solution:
    def minDistance(self, word1, word2):
        """
        :type word1: str
        :type word2: str
        :rtype: int
        """
        n = len(word1)
        m = len(word2)
        
        # 有一个字符串为空串
        if n * m == 0:
            return n + m
        
        # DP 数组
        D = [ [0] * (m + 1) for _ in range(n + 1)]
        
        # 边界状态初始化
        for i in range(n + 1):
            D[i][0] = i
        for j in range(m + 1):
            D[0][j] = j
        
        # 计算所有 DP 值
        for i in range(1, n + 1):
            for j in range(1, m + 1):
                left = D[i - 1][j] + 1
                down = D[i][j - 1] + 1
                left_down = D[i - 1][j - 1] 
                if word1[i - 1] != word2[j - 1]:
                    left_down += 1
                D[i][j] = min(left, down, left_down)
        
        return D[n][m]
  1. 打家劫舍
class Solution:
    def rob(self, nums: List[int]) -> int:
        if not nums:
            return 0

        size = len(nums)
        if size == 1:
            return nums[0]
        
        dp = [0] * size
        dp[0] = nums[0]
        dp[1] = max(nums[0], nums[1])
        for i in range(2, size):
            dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])
        
        return dp[size - 1]
  1. 打家劫舍II
class Solution:
    def rob(self, nums: [int]) -> int:
        def my_rob(nums):
            cur, pre = 0, 0
            for num in nums:
                cur, pre = max(pre + num, cur), cur
            return cur
        return max(my_rob(nums[:-1]),my_rob(nums[1:])) if len(nums) != 1 else nums[0]

5.最长回文子序列

class Solution:
    def longestPalindromeSubseq(self, s: str) -> int:
        n = len(s)
        maxL = -1
        dp = [[0]*n for _ in range(n)]

        for i in range(n):
            dp[i][i] = 1
        
        for i in range(n-1, -1, -1):
            for j in range(i+1, n):
                if s[i] == s[j]:
                    dp[i][j] = dp[i+1][j-1] + 2
                else:
                    dp[i][j] = max(dp[i][j-1], dp[i+1][j])
        
        return dp[0][n-1]

6.最长连续递增序列

class Solution(object):
    def findLengthOfLCIS(self, nums):
        ans = anchor = 0
        for i in range(len(nums)):
            if i and nums[i-1] >= nums[i]: anchor = i
            ans = max(ans, i - anchor + 1)
        return ans
@app.route('/api/assign-task', methods=['POST']) def assign_task(): """分配新任务""" data = request.json task_id = f"TASK-{len(all_tasks) + 1:03d}" # 确定任务步骤 task_type = data.get('task_type')代码是这个 steps = TASK_STEPS.get(task_type, ['执行任务']) # 生成任务描述 if task_type == TASK_TYPE_INBOUND: description = f"入库货物到{data.get('destination')}" elif task_type == TASK_TYPE_OUTBOUND: description = f"出库货物到{data.get('destination')}" else: description = f"{task_type}任务到{data.get('destination')}" task = { 'id': task_id, 'task_type': task_type, 'destination': data.get('destination'), 'priority': data.get('priority', '中'), 'status': TASK_STATUS_PENDING, 'current_step': 0, 'total_steps': len(steps), 'steps': steps, 'assigned_robot': None, 'created_time': datetime.now().strftime('%H:%M:%S'), 'started_time': None, 'completed_time': None, 'progress': 0, 'description': description } task_queue.append(task) all_tasks.append(task) # 添加到总任务列表 log_operation(f"创建任务 {task_id}: {task['description']}") return jsonify({'success': True, 'task_id': task_id}) def handle_low_battery(robot): """处理低电量机器人""" robot_id = robot['id'] current_battery = int(robot['battery']) # 如果已经在充维区,直接开始充电 if '充维区' in robot['position']: robot['status'] = '充电中' robot['current_task'] = '充电中' log_operation(f"{robot_id} 电量低({current_battery}%),开始充电") return # 否则返回最近的充维区 # 找到最近的充维区 charging_stations = ['充维区01', '充维区02', '充维区03', '充维区04', '充维区05', '充维区06'] nearest_station = None min_distance = float('inf') start_x, start_y = get_destination_coordinates(robot['position']) for station in charging_stations: end_x, end_y = get_destination_coordinates(station) distance = ((end_x - start_x) ** 2 + (end_y - start_y) ** 2) ** 0.5 if distance < min_distance: min_distance = distance nearest_station = station if nearest_station: # 生成返回充维区的路径 end_x, end_y = get_destination_coordinates(nearest_station) path = generate_robot_path(start_x, start_y, end_x, end_y) # 设置移动状态 robot_movements[robot_id] = { 'moving': True, 'path': path, 'current_index': 0, 'destination': nearest_station, 'is_charging_task': True # 标记为充电任务 } # 更新机器人状态 robot['status'] = '返回充维区' robot['current_task'] = '返回充电' log_operation(f"{robot_id} 电量低({current_battery}%),返回 {nearest_station} 充电")
11-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值