当前位置: 首页 > article >正文

动态规划 之 枚举型

文章目录

  • 枚举类型
    • 青蛙吃虫
  • 选择与不选择问题

动态规划的题目,主要分为枚举类型和这个是否选择的两种题型

  • 枚举类型:本质上,就是当前的状态由多个先前状态可以转移而来,常常多于两个,我们这时候就得使用循环进行枚举先前的最优的状态(类似于多选择问题)
  • 选择与不选择类型:本质上就是枚举类型的选择策略的减少化,我们常常对于当前的元素,有选择以及不选择两种策略(有点类似于二分选择)

枚举类型

青蛙吃虫

在这里插入图片描述
在这里插入图片描述

思路分析:

  • 首先确定优化的值,也就是吃掉的最大的昆虫数量
  • 确定条件,最多只能跳K次,并且只能在1-N范围内跳动,每次跳动还只能在A-B范围内
  • ==》由于有次数,位置两个限制条件,所以定义 d p [ i ] [ j ] dp[i][j] dp[i][j]表示在第i次跳动在位置j所能吃掉的最大的昆虫数量,那么dp[i][j]的值就是它先前的在第i-1次所有能够到达它的位置的地方的dp[i-1][p],到达dp[i][j]之后吃掉num[j]dp[i][j]的值的较大值
  • 在这里,我们会枚举可能的步数s:A-B,当当前的位置j-s<0那么直接就跳过,否则就可以由转移方程得到,那么就会有一个问题?是否可达?所以dp数组的初始值设置为负无穷,同时设定dp[0][0]=0
import os
import sys

# 请在此输入您的代码

# 动态规划求解
T = int(input())
# 该怎么说?dp[i][j]定义为 在第i次跳跃的时候,处于位置j所能够吃的最多的昆虫数目
for _ in range(T):
  N,A,B,K = map(int,input().split())
  num = [0] +  list(map(int,input().split()))
  dp = [[-float('inf')]*(N+1) for _ in range(K+1)]
  dp[0][0] = 0
  ans = 0
  for i in range(1,K+1):
    for j in range(1,N+1):
      for p in range(A,B+1):
        if j - p < 0:
          break
        dp[i][j] = max(dp[i][j],dp[i-1][j-p]+num[j])
      ans = max(ans,dp[i][j])
  print(ans)

选择与不选择问题


http://www.kler.cn/a/565915.html

相关文章:

  • Oracle 数据库基础入门(二):深入理解表的约束
  • [STM32]从零开始的STM32 DEBUG问题讲解及解决办法
  • 对比Grok3 普通账户与 30 美元 Super 账户:默认模式、Think 和 DeepSearch 次数限制以及如何升级
  • python-leetcode-删除并获得点数
  • CAS (Compare and swap “比较和交换“) [ Java EE 初阶 ]
  • 【Java基础】Java中new一个对象时,JVM到底做了什么?
  • 分布式系统中的关键技术解析:幂等性、负载均衡、限流算法及其实现
  • 做表格用什么软件?VeryReport让数据管理更高效!
  • 1.14 重叠因子:TRIMA三角移动平均线(Triangular Moving Average, TRIMA)概念与Python实战
  • 利用 Python 爬虫进行跨境电商数据采集
  • 1-8 gdb调试
  • 齿轮制造的“精密心脏”:蜗杆状砂轮磨齿机探秘
  • 回溯算法中的for循环和递归使用
  • Linux基础33-C语言篇之字符串的基础操作【入门级】
  • StableDiffusion打包 项目迁移 项目分发 1
  • vue el-table-column 单元表格的 省略号 实现
  • P1706 全排列问题
  • 使用python做http代理请求
  • docker和containerd从TLS harbor拉取镜像
  • Linux的诞生:一场自由与协作的技术革命