蓝桥杯之动态规划冲刺

news/2024/4/27 15:18:33

文章目录

  • 动态规划
    • 01背包
      • 小练一下
      • 01背包
      • 网格图上的DP
      • 完全背包
    • 最长公共字符串
    • 最长递增子序列

动态规划

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

  • 动态规划:确定好状态方程,我们常常是确定前 当状态来到 i 时,前 i 个物体的状态是怎么样的,我们并不是从一个点去考虑,也就是说虽然我们分割问题,但是问题是相互联系的,那么这就是区别于递归的本质区别

在这里插入图片描述

01背包

在这里插入图片描述
由于不能拆开,那就是DP 问题,如果能拆开,那就是贪心问题

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

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

小练一下

01背包

在这里插入图片描述

import os
import sys# 请在此输入您的代码N,V = map(int,input().split())w = []
v = []
w.append(0)
v.append(0)for i in range(N):a,b = map(int,input().split())w.append(a)v.append(b)dp = [[0]*(V+1) for _ in range(N+1)]for i in range(1,N+1):# 取出第i 个物品for j in range(V+1):if j-w[i]<0:dp[i][j]=dp[i-1][j]else:dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i])print(dp[N][V])

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

  • 可以对空间进行优化:只用添加两个变量来存储new,old 就是利用滚动数组,两个数组即可解决

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

在这里插入图片描述

import os
import sysV = int(input())#####箱子容量
n = int(input())####物品数量
l = [0]####各自体积
for i in range(n):####输入体积l.append(int(input()))
dp = [[0 for j in range(V+1)]for i in range(n+1)]for i in range(1,n+1):###for j in range(1,V+1):####if j < l[i]:####dp[i][j] = dp[i-1][j]else:dp[i][j]=max(dp[i-1][j],dp[i-1][j-l[i]]+l[i])###
print(V-dp[n][V])

同样的思路:还是用二维数组存储,dp[i][j]表示 前i 个物体在空间j 的情况下,所能放的空间的大小

网格图上的DP

在这里插入图片描述

  • 对于网格的问题,咋一看好像可以用搜索来解决,但是搜索的话可能就会超时,所以我们可以用动态规划来做,那么如何进行定义?
    dp[i][j] 就是走到(i,j) 的时候的路径数,那么就有 动态规划的式子 :
    dp[i][j] = dp[i-1][j] + dp[i][j-1] 得来
    对于不能到达的地方,就直接 设置dp 值为0即可
    巧妙地地方:让出发点以及🐎所在地点以及终点都偏移,这样就可以方便解决出界地问题
import os
import sys# 请在此输入您的代码bx, by, mx, my = map(int, input().split())bx += 2
by += 2
mx += 2
my += 2dp = [[0] * (30) for i in range(30)]s = [[False] * 30 for i in range(30)]dp[2][1] = 1
s[mx][my] = Trues[mx - 1][my - 2] = True
s[mx - 1][my + 2] = True
s[mx - 2][my - 1] = True
s[mx - 2][my + 1] = True
s[mx + 1][my - 2] = True
s[mx + 1][my + 2] = True
s[mx + 2][my - 1] = True
s[mx + 2][my + 1] = Truefor i in range(2, bx + 1):for j in range(2, by + 1):if s[i][j]:dp[i][j] = 0else:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]print(dp[bx][by])

完全背包

在这里插入图片描述

  • 完全背包问题就是在01 背包的基础上,每一件物品是没有个数的限制的,不过可以参照01 背包的思路,因为当第i 种物品的第一件物品就是01 背包问题,后面就是要考虑第 i 件物品
    状态方程
    1.dp[i][j] 表示前 i 种物品,在空间为 j 下能够装下的最大的价值
    2.那么当 pw[i] 第 i 件物品占用的体积大于 j 的时候,那么就只能
    dp[i][j] = dp[i-1][j]
    3.当pw[i] 第 i 件物品占用的体积小于等于 j 的时候,那么就是考虑第i 种物品选不选的问题了,也就是
    dp[i][j] = max(dp[i-1][j] ,dp[i][j-pw[i]]+pv[i])
    其中,dp[i-1][j] 是考虑不选第i 种物品,dp[i][j-pw[i]]+pv[i](01背包的本质区别)是在选了第i 种物品的基础上,再选几件的问题
import os
import sys# 请在此输入您的代码N,V = map(int ,input().split())
pw=[0]
pv=[0]
dp = [[0]*(V+1) for i in range(N+1)]for i in range(N):a,b = map(int,input().split())pw.append(a)pv.append(b)for i in range(1,N+1):for j in range(1,V+1):if j<pw[i]:dp[i][j] = dp[i-1][j]else:dp[i][j] = max(dp[i-1][j],dp[i][j-pw[i]]+pv[i])print(dp[N][V])

最长公共字符串

在这里插入图片描述

  • 对于这个问题,我们就要考虑从二维方面出发:
    dp[i][j] 表示前i 个 x 的字符 和前 j 个 y 的字符的最长的公共子序列的长度
    1.当x[i]==y[j] 的时候,那么就直接是dp[i][j] = dp[i-1][j-1] +1
    2.不相等的时候,就是dp[i][j] = max(dp[i-1][j],dp[i][j-1])

对于统计数目的话,还在研究:

import os
import sys# 请在此输入您的代码x = input()
y = input()# dp[i][j] 表示 x=xi 与 y=yj 时x与y 的最大的公共子序列的长度
lenx = len(x)
leny = len(y)dp = [[0]*(len(y)) for i in range(len(x))]for i in range(lenx):if x[i]==y[0]:dp[i][0]=1
for i in range(leny):if x[0]==y[i]:dp[0][i]=1for i in range(1,lenx):for j in range(1,leny):if x[i]==y[j]:dp[i][j]=dp[i-1][j-1]+1else:dp[i][j]=max(dp[i-1][j],dp[i][j-1])length =dp[lenx-1][leny-1]
sum=0
for i in range(lenx):for j in range(leny):if dp[i][j]==length:sum = sum +1sum = sum%100000000
print(length)
print(sum)

最长递增子序列

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/10807.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

Linux工具 - 耀眼的git

~~~~ 前言耀眼的GitGit是什么&#xff08;本质&#xff09;Git出现的背景&#xff08;本着开源的精神&#xff09;在命令行中使用Git&#xff08;Come on 来使用Git吧&#xff09;.git文件说明新建仓库git clone 克隆云端仓库到本地git addgit commit -mgit pushgit pullgit st…

vue项目设置通过IP和localhost可同时访问

vue项目设置通过IP和localhost可同时访问 打开package.json文件 在要运行的分支下添加host,最后重新运行项目 重新运行项目 "dev": "webpack-dev-server --inline --progress --config build/webpack.dev.conf.js --host 0.0.0.0",

Spring6--基于注解管理Bean / 手写IOC

1. 基于注入管理Bean概念 Java 5 引入了注解&#xff08;Annotation&#xff09;这一特性&#xff0c;它允许程序员在源代码中插入元数据&#xff0c;这些元数据以标签形式存在&#xff0c;可以被编译器、类加载器或运行时环境所识别和处理。注解可以帮助开发者在不修改业务逻…

cannot find -xml2: No such file or directory的解决方法

一&#xff0c;问题现象 在编译库的时候出现如下图所示的报错&#xff1a;C:/msys64/mingw32/bin/…/lib/gcc/i686-w64-mingw32/13.2.0/…/…/…/…/i686-w64-mingw32/bin/ld.exe: ca nnot find -lxml2: No such file or directory collect2.exe: error: ld returned 1 exit s…

高性能 MySQL 第四版(GPT 重译)(三)

第八章&#xff1a;查询性能优化 在前几章中&#xff0c;我们解释了模式优化和索引&#xff0c;这对于高性能是必要的。但这还不够——您还需要设计良好的查询。如果您的查询不好&#xff0c;即使是设计最佳的模式和索引也不会表现良好。 查询优化、索引优化和模式优化是相辅…

【类脑智能】脑网络通信模型分类及量化指标(附思维导图)

脑网络通信模型分类及量化指标(附思维导图) 参考论文&#xff1a;Brain network communication_ concepts, models and applications 概念 脑网络通信模型是一种使用图论和网络科学概念来描述和量化大脑结构中信息传递的模型。这种模型可以帮助研究人员理解神经信号在大脑内…