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

动态规划相当于正着想?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:continuedp[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])%modelse: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] +1else:dp[i][j] = max([dp[i-1][j],dp[i][j-1]])
# output(dp)
print(dp[n][m])

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

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

相关文章

用顺序表实现通讯录

前言 这次的通讯录是基于上一篇的动态顺序表的基础上实现的&#xff0c;如果对动态顺序表不熟悉&#xff0c;可以打开这个链接阅读http://t.csdnimg.cn/9zJ5g&#xff0c;这里我们会调用动态顺序表的函数。 如果想看静态顺序表实现通讯录&#xff0c;可以打开这个链接阅读http:…

Linux+HA高可用24X7的安全保证

一&#xff0e; 介绍作为服务器&#xff0c;需要提供一定的24X7的安全保证&#xff0c;这样可以防止关键节点的宕机引起系统的全面崩溃。利用OpenSource开源软件&#xff0c;完成系统的高可靠双机热备方案。基于linux的 HA软件可靠稳定&#xff0c;比使用商业版本的HA软件降低成…

CMakeLists.txt编写简单介绍:CMakeLists.txt同时编译.cpp和.cu

关于CMakeLists.txt的相关介绍,这里不赘诉,本人的出发点是借助于CMakeLists.txt掌握基本的C++构建项目流程,下面是本人根据网络资料以及个人实践掌握的资料。 CMakeList.txt构建C++项目 下图是一个使用CUDA实现hello world的项目,一般来说,一个标准的C++项目包括三个文件…

python标准数据类型--列表常用方法

在Python中&#xff0c;列表&#xff08;List&#xff09;是一种非常常用的数据类型&#xff0c;用于存储一组有序的元素。Python提供了许多内置方法来操作列表&#xff0c;使得对列表的处理变得非常灵活和便捷。在本篇博客中&#xff0c;我们将介绍一些常用的列表方法&#xf…

基本数据类型、包装类与字符串间的转换

&#xff08;1&#xff09;基本数据类型转为字符串 方式1&#xff1a;调用字符串重载的valueOf()方法 int a 10; //String str a;//错误的String str String.valueOf(a);方式2&#xff1a;更直接的方式 int a 10;String str a "";&#xff08;2&#xff09;…

COCO格式转YOLO格式训练

之前就转换过好几次&#xff0c;每次换设备训练&#xff0c;由于压缩包太大&#xff0c;u盘不够用。每次都要找教程从网上再下载一遍。因此这里记录一下&#xff0c;以免下次重新找教程。 在coco数据集中&#xff0c;coco2017train或coco2017val数据集中标注的目标(类别)位置在…

C++--对象作为返回值-----拷贝构造函数不执行的问题解决方案

1.问题现象 本来func函数返回p1&#xff0c;实际上p1会先拷贝一份传递给test函数里面的p,这个时候会执行拷贝构造函数&#xff0c;但是实际上的输出并没有&#xff1b; 而且执行拷贝构造函数的时候&#xff0c;因为生成p1的副本&#xff0c;所以我们打印的地址应该不相同&…

vue3源码解析——watch和watchEffect区别

watch和watchEffect是Vue 3.0中新增的两个响应式API&#xff0c;用于监听数据的变化。watch适用于需要获取新值和旧值&#xff0c;或者需要懒执行的场景&#xff0c;而watchEffect适用于需要监听多个数据源&#xff0c;并且需要立即执行的场景。它们之间的区别如下&#xff1a;…

CSS层叠样式表学习(文本属性)

&#xff08;大家好&#xff0c;今天我们将继续来学习CSS文本属性的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 四、CSS文本属性 4.1 文本颜色 4.2 对齐文本 4.3 装饰文本 4.4 文本缩进 4.5 行间距 4.6 文本…

苍穹外卖学习笔记(一)开发环境搭建

苍穹外卖技术框架 网关层&#xff1a; Nginx:反向代理负载均衡 nginx学习&#xff0c;看这一篇就够了&#xff1a;下载、安装。使用&#xff1a;正向代理、反向代理、负载均衡。常用命令和配置文件,很全-CSDN博客应用层&#xff1a; Spring Boot&#xff1a;简化spring程序的创…

计算机内存是如何管理的

计算内存的那些事儿——内存管理 大家回忆一下&#xff0c;计算机结构&#xff0c;或者说一个SoC&#xff08;system-on-chip&#xff09;芯片的结构。 cpu、memory、peripherals&#xff0c;这是计算机的主要部件&#xff0c;三者之间通过system bus勾搭在一起。 The main co…

第五篇:3.4 用户归因和受众(User attribution and audience) - IAB/MRC及《增强现实广告效果测量指南1.0》

翻译计划 第一篇概述—IAB与MRC及《增强现实广告效果测量指南》之目录、适用范围及术语第二篇广告效果测量定义和其他矩阵之- 3.1 广告印象&#xff08;AD Impression&#xff09;第三篇广告效果测量定义和其他矩阵之- 3.2 可见性 &#xff08;Viewability&#xff09;第四篇广…

Vulnhub:BOSSPLAYERSCTF: 1

目录 信息收集 arp nmap nikto whatweb WEB web信息收集 dirmap 命令执行漏洞 反弹shell 提权 系统信息收集 get root 信息收集 arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:50:56:2f:dd:9…

找不到api-ms-win-crt-runtime-l1-1-0.dll,无法继续执行代码的解决方法

当电脑系统中关键文件“api-ms-win-crt-runtime-l1-1-0.dll”发生丢失情况时&#xff0c;会导致某些应用程序无法正常运行。api-ms-win-crt-runtime-l1-1-0.dll是Windows操作系统中至关重要的动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它包含了应用程序在运行过程…

【java探索之旅】逻辑控制掌握 顺序结构 分支语句

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; Java编程秘籍 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一、逻辑控制的概念二、顺序结构三、分支结构3.1 if语句3.2 if习题巩固3.3 细节注意项…

【个人笔记】如何用 Python 编写激活码解锁程序,方法二

目录 前言 第一步&#xff1a;编写激活码解锁程序&#xff08;激活码.py&#xff09; 第二步&#xff1a;修改需要解锁的程序&#xff08;1.py&#xff09; 总结 前言 在软件开发中&#xff0c;有时我们需要设计一种机制来保护程序&#xff0c;例如通过激活码来控制程序的…

Cortex-M7 异常处理与返回

1 前言 当CM3开始响应一个中断时&#xff0c;会在它小小的体内奔涌起三股暗流&#xff1a;  入栈&#xff1a; 把8个寄存器的值压入栈;  取向量&#xff1a;从向量表中找出对应的服务程序入口地址;  选择堆栈指针MSP/PSP&#xff0c;更新堆栈指针…

C语言 | Leetcode C语言题解之第2题两数相加

题目&#xff1a; 题解&#xff1a; struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {struct ListNode *head NULL, *tail NULL;int carry 0;while (l1 || l2) {int n1 l1 ? l1->val : 0;int n2 l2 ? l2->val : 0;int sum n1 n2 …

「每日跟读」英语常用句型公式 第3篇

「每日跟读」英语常用句型公式 第3篇 1. I don’t know how to ____ 我不知道如何_____ I don’t know how to play soccer (我不知道怎么踢足球) I don’t know how to study&#xff08;我不知道如何学习&#xff09; I don’t know how to play chess (我不知道如何下国…

使用 Kafka 保证消息不丢失的策略及原理解析

✨✨祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天开心&#xff01;✨✨ &#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目录 一、引言 二. 持久化存储 2.1持久化存储原理&#xff1a; 2.2使用示例&#xff1a; …