蓝桥杯(4):python动态规划DF[1]

news2025/1/19 11:13:52

动态规划相当于正着想?dfs主要适用于位置的变化?

子问题!状态,状态转移方程

1 一维DP

1.1 定义

重叠子问题!转换成子问题 ,与记忆化搜索很像

1.2 例子

1.2.1 上楼梯

子问题到最终的问题只能跨一步:比如:4个台阶的话,可以从2或3走上来,但没有1!!!

1到4肯定要跨两步了

其实 就是斐波那契数列

#上楼梯
n = int(input())
dp = [0]*(n+1)
dp[1] = 1
dp[2] = 2
for i in range(3,n+1):
    dp[i] = dp[i-1] + dp[i-2]
print(dp[n])

1.3 步骤

1.4 例题

1.4.1 破损的楼梯

# 破损的楼梯
n,m = list(map(int,input().split()))
a = list(map(int,input().split()))
vis = [0]*(n+1)
for i in a:
    vis[i]=1
dp = [0]*(n+1)
dp[0]=1
dp[1] =1-vis[1]
for i in range(2,n+1):
    if vis[i]==1:
        continue
    dp[i] = dp[i-1]+dp[i-2]
print(dp[n])

1.4.2 安全序列

##安全序列
#输入
n,k = list(map(int,input().split()))
dp = [0]*(n+1)
dp[0] = 1
dp[1] = 2
mod = 10**9+7
for i in range(2,n+1):
    if i-k-1>0:
        #说明和这个位置相隔k的位置是存在的或许可以放置
        #dp[i-1]说明没有放置! dp[i-k-1]说明放置了
        #没有放置,则和前面的方案数一样;放置,则前间隔n个都不能放置,方案数为第(i-k-1)位置上的大小咯
        dp[i] = (dp[i-1]+dp[i-k-1])%mod
    else:
        dp[i] = (dp[i-1]+1)%mod
print(dp[n])

2 二维DP

2.1 定义

2.2 例题

2.2.1 数字三角形

用状态1写

##数字三角形
# 特点:第n行有n个数字
n = int(input())
a = [[0],]
dp = [[0]*(i+1) for i in range(n+1)]
for i in range(n):
    a.append([0] + list(map(int, input().split())))

#用状态1写:(i,j)表示从(i,j)往下走的最大和
#输出的应该是dp[1][1]
for i in range(n,0,-1):
    for j in range(1,i+1):
        if i==n:
            dp[i][j]=a[i][j]
        else:
            dp[i][j] = max(dp[i+1][j],dp[i+1][j+1]) +a[i][j]
print(dp[1][1])

# 5
# 7
# 3 8
# 8 1 0
# 2 7 4 4
# 4 5 2 6 5

用状态2写

##数字三角形
# 特点:第n行有n个数字
n = int(input())
a = [[0],]
dp = [[0]*(n+1) for i in range(n+1)]
for i in range(n):
    a.append([0] + list(map(int, input().split())))

#(i,j)表示到达(i,j)的最大和
for i in range(1,n+1):
    for j in range(1,i+1):
        if i==1:
            dp[1][1] = a[1][1]
        else:
            dp[i][j] = max(dp[i-1][j-1],dp[i-1][j])+a[i][j]

print(max(dp[n]))

2.2.2 摆花

#摆花
n,m = list(map(int,input().split()))
a = [0]+list(map(int,input().split()))
# 摆到第i个花的时候已经有j盆花了
# dp[i][j]
# 第i种花,摆0到i盆
# dp[i][j]= dp[i-1][j]+dp[i-1][j-1]+dp[i-1][j-2] +......+dp[i-1][j-i]
# 边界:dp[0][0] = 1 dp[0][1] =1 dp[0][j] = 0
# dp[1][1]=2
dp = [[1]+[0]*m for i in range(n+1)]

for i in range(1,n+1):
    for j in range(1,m+1): #有几盆花
        for k in range(0,min(a[i],j)+1):
            dp[i][j] += dp[i-1][j-k]
            dp[i][j]%=10**6+7
print(dp[n][m])

2.2.3 选数异或

n,x = list(map(int,input().split()))
a = [0]+list(map(int,input().split()))
# 状态dp[i][j]表示前i个数字异或的值是j
# 状态转移: 当第i个数字选择的时候 dp[i][j] = dp[i-1][j^a[i]]
# 当第i个数字没选的时候 dp[i][j] = dp[i-1][j]
dp = [[0]*64 for i in range(n+1)]
dp[0][0] = 1
for i in range(1,n+1):
    for j in range(64):
        dp[i][j] = (dp[i-1][j]+dp[i-1][j^a[i]]) % 998244353
print(dp[n][x])

3 最长上升子序列

3.1 定义

3.1.1 子序列

状态是什么?

后面的数字必须比前面的大!!

比如现在拿到的时a[2](值为4),这时前面比4小的有1和3,对应的长度分别时1和2

就选2 在2的基础上再加1

3.2 例题

3.2.1 蓝桥勇士

n = int(input())
a = [0] + list(map(int,input().split()))
dp = [1]*(n+1)

# i表示选择第i个数字
# j表示前面的数字
for i in range(1,n+1):
    for j in range(1,i):
        if a[j]<a[i]:
            dp[i] = max(dp[j]+1 ,dp[i])

print(max(dp))

注意边界全是1!!!!!!!!刚开始以自己结尾一定选自己,方案数为1!!

3.2.2 合唱队形

# 最高的中间旁边依次降低
# 假设最高的站在第i个位置 i前面是上升序列  i后面是下降序列
n = int(input())
t = [0]+list(map(int,input().split()))
dp1 = [1]*(n+1) #存储最大上升子序列
dp2 = [1]*(n+1) #存储最大下降子序列
for i in range(1,n+1):
    for j in range(1,i):
        if t[j]<t[i]:
            dp1[i] = max(dp1[j]+1,dp1[i])
# print(dp1)
for i in range(n,0,-1):
    for j in range(i+1,n+1):
        if t[i]>t[j]:
            dp2[i] = max(dp2[j]+1,dp2[i])
# print(dp2)
ans = max([dp1[i]+dp2[i]-1 for i in range(1,n+1)])
print(n-ans)


4 最长公共子序列

4.1 定义

对于两个数组而言的

如果dp[i][j]对应的a[i]和b[j]是相等的说明 子序列的长度可以加1,在谁的基础上加1呢,左上角的就都可以!!!!【观察这个矩阵不看边界,可以知道对角线上的元素是一样的】加1肯定是在上一个对角线上咯!!!

如果对应的值不相等 说明这时的值还是上一条对角线对应的值,所以往上或左找 就是他!

怎么找出具体的公共子序列:

可以向上走或者想左走:说明上一条对角线的数和自己相同,没有发生状态转移,则回到这个位置,试图找到发生转移的点

不可以走的时候:说明发生的状态转移,转移一定发生在正对角线上!!!

4.2 例题

def output(a):
    n = len(a)
    for i in range(0,n):
        print(" ".join(map(str,a[i][0:])))


n,m = list(map(int,input().split()))
a = [0]+list(map(int,input().split()))
b = [0]+list(map(int,input().split()))
dp = [[0]*(m+1) for i in range(n+1)]#状态
for i in range(1,n+1):
    for j in range(1,m+1):
        if a[i] == b[j]:
            dp[i][j] = dp[i-1][j-1] +1
        else:
            dp[i][j] = max([dp[i-1][j],dp[i][j-1]])
# output(dp)
print(dp[n][m])

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

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

相关文章

arm裸机-1、定时器pwm

时钟配置 我们使用s3c2440&#xff0c;主频12M&#xff0c;查看用户手册 通过锁相环抬升到400MHZ&#xff0c;分成三条通路&#xff0c;通过HHDIVN和PDIVN配置频率比&#xff0c;这个频率比配置手册已经给出。 配置MPLL主频400Mhz&#xff0c; 通过这个公式算出MPLL s、p、m都…

LeetCode 1379.找出克隆二叉树中的相同节点:二叉树遍历

【LetMeFly】1379.找出克隆二叉树中的相同节点&#xff1a;二叉树遍历 力扣题目链接&#xff1a;https://leetcode.cn/problems/find-a-corresponding-node-of-a-binary-tree-in-a-clone-of-that-tree/ 给你两棵二叉树&#xff0c;原始树 original 和克隆树 cloned&#xff0…

《QT实用小工具·五》串口助手

1、概述 源码放在文章末尾 该项目实现了串口助手的功能&#xff0c;可在界面上通过串口配置和网络配置进行串口调试。 基本功能 支持16进制数据发送与接收。支持windows下COM9以上的串口通信。实时显示收发数据字节大小以及串口状态。支持任意qt版本&#xff0c;亲测4.7.0 到…

《数字图像处理》-上机 5 图像阈值化处理、霍夫变换及形态学算法

一、上机目的 学习图像阈值化处理、霍夫变换、形态学算法及编程实现方法 二、相关知识及练习 1、图像阈值化处理 图像阈值化&#xff08;Binarization&#xff09;旨在剔除掉图像中一些低于或高于一定值的像素&#xff0c;从而提 取图像中的物体&#xff0c;将图像的背景和…

【JavaScript】函数 ⑦ ( 函数定义方法 | 命名函数 | 函数表达式 )

文章目录 一、函数定义方法1、命名函数2、函数表达式3、函数表达式示例 一、函数定义方法 1、命名函数 定义函数的标准方式 就是 命名函数 , 也就是之前讲过的 声明函数 ; 函数 声明后 , 才能被调用 ; 声明函数的语法如下 : function functionName(parameters) { // 函数体 …

探索前端架构:MVC、MVVM和MVP模式

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

qt通过setProperty设置样式表笔记

在一个pushbutton里面嵌套两个label即可&#xff0c;左侧放置图片label&#xff0c;右侧放置文字label&#xff0c;就如上图所示&#xff1b; 但是这时的hover&#xff0c;press的伪状态是没有办法“传递”给里面的控件的&#xff0c;对btn的伪状态样式表的设置&#xff0c;是不…

提升工作效率:B端工作台设计基础详解

随着互联网和信息技术的快速发展&#xff0c;越来越多的企业开始以数字化、智能化的方式管理和运营自己的业务。B端工作台设计作为企业应用的重要组成部分&#xff0c;越来越受到重视。本文将从三个方面对B端工作台设计进行全面分析。让我们看看。 1. B端工作台设计原则 B端工…

16.springboot项目下使用事务(springboot-016-transaction)

事务是一个完整的功能&#xff0c;也叫作是一个完整的业务 事务只跟什么SQL语句有关&#xff1f;事务只跟DML语句有关系&#xff1a;增删改 DML,DQL,DDL,TCL,DCL 首先添加两个依赖以及MyBatis代码自动生成插件 <!--MySql驱动--><dependency><groupId>mysql…

Spring-IoC 基于注解

基于xml方法见&#xff1a;http://t.csdnimg.cn/dir8j 注解是代码中的一种特殊标记&#xff0c;可以在编译、类加载和运行时被读取&#xff0c;执行相应的处理&#xff0c;简化 Spring的 XML配置。 格式&#xff1a;注解(属性1"属性值1",...) 可以加在类上…

全球主机监控

全球主机监控 - 国内外VPS、云服务器的库存监控和优惠信息全球主机VPS库存监控补货通知 Stock Monitor 绿云GreenCloudVPS库存监控 搬瓦工BandwagonHost库存监控 斯巴达SpartanHost库存监控 CloudCone库存监控 AlphaVps库存监控 BuyVm 库存监控 Dmit库存监控 xTom/V.PS库存监控…

【上海大学计算机组成原理实验报告】二、数据传送实验

一、实验目的 了解在模型机中算术、逻辑运算单元的控制方法。学习机器语言程序的运行过程。通过人工译码&#xff0c;加深对译码器基本工作原理的理解。 二、实验原理 根据实验指导书的相关内容&#xff0c;本次实验所要用的CP226实验仪在手动方式下&#xff0c;运算功能通过…

前视声呐目标识别定位(三)-部署至机器人

前视声呐目标识别定位&#xff08;一&#xff09;-基础知识 前视声呐目标识别定位&#xff08;二&#xff09;-目标识别定位模块 前视声呐目标识别定位&#xff08;三&#xff09;-部署至机器人 前视声呐目标识别定位&#xff08;四&#xff09;-代码解析之启动识别模块 …

攻防世界 xff_referer 题目解析

xff_referer 一&#xff1a;了解xxf和Referer X-Forwarded-For:简称XFF头&#xff0c;它代表客户端&#xff0c;也就是HTTP的请求端真实的IP&#xff0c;只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。 一般的客户端发送HTTP请求没有X-Forwarded-For头的&#xff0…

js表达式

js 数据&#xff1a; 字面量 1 123 变量 a 表达式 12 2*2 a&&b 表达式都会有一个返回结果。表达式仍然是数据&#xff0c;所有可以写字面量&#xff0c;变量的地方都可以写表达式 在JavaScript中&#xff0c;表达式中的运算符具有不同的优先级&#xff0c;这决定…

【OJ】动规练习六

个人主页 &#xff1a; zxctscl 如有转载请先通知 题目 1. 413. 等差数列划分1.1 分析1.2 代码 2. 978. 最长湍流子数组2.1 分析2.2 代码 3. 139. 单词拆分3.1 分析3.2 代码 1. 413. 等差数列划分 1.1 分析 一、题目解析&#xff1a; 至少有三个元素才能构成等差数列&#xff…

JWT--study

JWT 1、简介 2、结构 头部 载荷 签证 应用 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version> </dependency>Token 生成 解析token package com.wang.utils;import io.…

用anaconda创建新的虚拟环境

1.打开Anaconda Prompt&#xff0c;进入base环境 2.确定新的虚拟环境的名字及python版本 conda create -n test python3.9选y并回车 3.创建成功 4.激活test环境 conda activate test然后就可以开始你的操作了~

通用开发技能系列:Authentication、OAuth、JWT 认证策略

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 通用开发技能系列 文章&#xff0c;主要对编程通用技能 Authentication、OAuth、JWT 认证策略 进行学习 1.Basic Authentication认证 每个请求都需要将 用户名密码 进行base64编码后&#xff0c;放在请求头的A…

Oracle RAC One Node,双胞胎变独生子?

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…