【笔记】二维DP

news2024/12/23 17:47:13

文章目录

    • 例题
      • lanqiao1536数字三角形
        • 题目描述
        • 输入描述
        • 输出描述
        • 解题思路
          • 选取状态1
          • 代码1
          • 选取状态2
          • 代码2
      • lanqiao 389摆花
        • 题目描述
        • 输入描述
        • 解题思路
        • 输出描述
        • 代码
      • lanqiao3711选数异或
        • 题目描述
        • 输入描述
        • 输出描述
        • 解题思路
      • lanqiao3348可构造的序列总数

二维DP和普通DP本质相同,只是状态的维度变成二维,即需要两个变量来定义子问题

二维DP的更新可能涉及部分优化:前缀和、滚动数组

核心就是怎么从子问题到原问题

例题

lanqiao1536数字三角形

在这里插入图片描述

题目描述

给出一个数字三角形,从顶部到底部可以沿左斜线向下或者右斜线向下,要求数字之和最大,求最大和。

输入描述
  • 第一行:包含一个整数N,表示三角形的行数
  • 下面N行给出数字三角形,每个数字都是0-99之间的整数。
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
输出描述

输出一个整数,表示最大和

30
解题思路

对于这个题目来说,从上面开始一层层往下加和从下面一层层往上加能得到的最大值应该是一致的。

选取状态1

dp[i][j]表示从第i行第j个往下走的最大和

(1,1)
(2,1)(2,2)
(3,1)(3,2)(3,3)

dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j]

  • dp[i][j]表示从(i,j)出发到底部的最大和
  • a[i][j]表示第i行第j个元素的值
  • 最终答案等于第n行dp[n][x]里面最大的一个
代码1
n=int(input())
# 这里用n+1是因为列表下标从1开始
# 用a数组来存储三角形的数值
a=[[0]*(n+1)]
for i in range(n):
    a.append([0]+list(map(int,input().split())))
# 用dp来存储第i行第j个数最大和
dp=[[0]*(n+1) for i in range(n+1)]
# 三角形尖端的值为a的第一行第一个值
dp[1][1]=a[1][1]
for i in range(2,n+1):
    for j in range(1,i+1):
        if j==1:
            dp[i][j]=dp[i-1][j]+a[i][j]
        elif j==i:
            dp[i][j]=dp[i-1][j-1]+a[i][j]
        else:
            dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j]

ans=0
for j in range(1,n+1):
    ans=max(ans,dp[n][j])

print(ans)
选取状态2

dp[i][j]表示从第i行第j个往上走的最大和

(1,1)
(2,1)(2,2)
(3,1)(3,2)(3,3)

dp[i][j]=max(dp[i+1][j+1],dp[i+1][j])+a[i][j]

  • dp[i][j]表示从(i,j)出发到底部的最大和
  • a[i][j]表示第i行第j个元素的值
  • 最终答案等于dp[1][1]
代码2
n=int(input())
a=[[0]*(n+1)]
for i in range(n):
    a.append([0]+list(map(int,input().split())))
# 初始化存储最大和的数组
dp=[[0]*(n+1) for i in range(n+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])

lanqiao 389摆花

题目描述

小明在花店门口摆上一排花,共m盆。通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号。规定第i种花不能超过 a i a_{i} ai盆,摆花时同种花放在一起,且不同种类花需按标号的从小到大排列。

问:一共有多少种不同的摆花方案?

输入描述

第一行包含两个正整数 n和 m,中间用一个空格隔开。

第二行有 n 个整数,每两个整数之间用一个空格隔开,依次表示a1、a2、…an 。
其中,0<n≤100,0<m≤100,0≤ai≤100,0<n≤100,0<m≤100,0≤ai≤100。

2 4
3 2
解题思路
  • 状态:dp[i][j]表示前i种花,数量为j盆的方案数,答案为dp[n][m]
  • 状态转移:dp[i][j]=dp[i-1][j]+…+dp[i-1][j-a[i]]表示从前i-1种花到第i种花,摆0盆、1盆…、a[i]盆的情况。
  • 边界:dp[…][0]=1表示前几种花都没摆的情况
输出描述

输出只有一行,一个整数,表示有多少种方案。注意:因为方案数可能很多,请输出方案数对 1 0 6 + 7 10^6+7 106+7 取模的结果。

2
代码
a=[0]+list(map(int,input().split()))
# 状态dp[i][j]前i种花、总数是j盆的方案数,答案是dp[n][m]
dp=[[0]*(m+1) for _ in range(n+1)]
# 状态转移方程:第i种花可以摆0-a[i]盆,所以从第i-1到第i的状态转移方程为:dp[i][j]=dp[i-1][j]+dp[i-1][j-1]+……+dp[i-1][j-a[i]]
# 边界条件:前面几种花一盆都不放的方案数是1,dp[i][0]=1
# 注意:这里的初始化从0开始,为了给后面的赋值
for i in range(n+1):
  dp[i][0]=1
for i in range(1,n+1):
  for j in range(1,m+1):
    for k in range(min(a[i],j)+1):
      dp[i][j]+=dp[i-1][j-k]
      dp[i][j]%1000007
print(dp[n][m])

lanqiao3711选数异或

题目描述

给定n个正整数a[i],询问其中有多少个不同的子序列进行异或运算的值为x?

由于结果很大,需要对998244353取模

异或运算:位运算的一种,相同为0,不同为1,参考这个

输入描述

第一行:两个正整数n,x(x<64)

第二行:输入n个正整数

输出描述

输出方案数,对998244353取模

解题思路

原问题:给定n个正整数,求有多少个子序列进行异或运算的值为x,方案数

子问题:前i个正整数,有多少个子序列异或值为j,的方案数

状态:dp[i][j]表示前i个数,子序列异或为j的方案数

状态转移方程:对于第i个数,有选和不选两种可能

    • xxx^a[i]=j⇒xxx^a[i]^a[i]=j^a[i]⇒xxx=j^a[i]
    • dp[i][j]=dp[i-1][j^a[i]]
  • 不选
    • dp[i][j]=dp[i-1][j]
n,x=map(int,input().split())
a=[0]+list(map(int,input().split()))
dp=[[0]*64 for i in range(n+1)]
#只有一个数时,无论选还是不选,都各只有一种可能
dp[1][0]=1
dp[1][a[1]]=1
for i in range(2,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])

lanqiao3348可构造的序列总数

- 题目描述
    - 给定两个数字k和n,需要构造序列满足:
        - 序列长度为n
        - 序列中每个元素区间[1,k]
        - 序列中的下一个元素是上一个元素的倍数
        - 答案很有可能很大,需要对1e9+7取模
- 输入格式
    - 输入一行k,n
- 输出格式
    - 输出一个整数表示答案,答案需要对1e9+7取模
- 解题思路
    - dp[i][j]表示以j结尾的长度为i的序列
    - 状态转移方程就是找i-1长度的j的因数
    - 找j的因数时对其开根号,优化时间复杂度
k, n = map(int, input().split())
mod = int(1e9) + 7
N = 2000

# dp -> 以j数字结尾,长度为i的倍数序列
dp = [[0] * (N + 10) for i in range(N + 10)]
dp[1] = [0] + [1] * (N + 9)
for i in range(1, N + 10): dp[i][1] = 1

# 找num的因数
def check(num):
    ans = []
    for i in range(1, int(num**0.5) + 1):
        if num % i→0:
            ans.append(i)
            ans.append(num // i)
    return set(ans) # 用set去重

# 递推dp数组
for i in range(2, n + 1):
    for j in range(2, k + 1):
        for q in check(j): # q为j的因数
            dp[i][j] += dp[i - 1][q]

ans = 0
for i in range(1, k + 1):
    ans += dp[n][i]
    
print(ans % mod)

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

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

相关文章

ios 用JXCategoryView 库实现tab滑动切换viewController

先Pod导入安装 pod JXCategoryView.m文件 // // OrderViewController.m // scxhgh2 // // Created by xmkjsoft on 2024/9/9. //#import "OrderViewController.h" #import "NavigationBarUtils.h" #import <JXCategoryView/JXCategoryView.h>#im…

《深度学习》深度学习 框架、动态展示即推导

目录 一、深度学习 1、什么是深度学习 2、特点 3、神经网络构造 1&#xff09;单层神经元 • 推导 • 示例 2&#xff09;多层神经网络 3&#xff09;小结 4、感知器 神经网络的本质 5、多层感知器 6、动态图像示例 1&#xff09;一个神经元 相当于下列状态&…

Redis入门 - C#|.NET Core封装Nuget包

经过前面章节的学习&#xff0c;可以说大家已经算Redis开发入门了。已经可以去到项目上磨砺了。 但是今天我还想和大家分享一章&#xff1a;封装自己的Redis C#库&#xff0c;然后打包成Nuget包。 首先要说明的是&#xff1a;不是要自己开发一个Redis客户端库&#xff0c;而是…

【Linux】Linux常见指令以及权限理解(下)

【Linux】Linux常见指令以及权限理解&#xff08;下&#xff09; &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;Linux&#x1f34a; &#x1f33c;文章目录&#x1f33c; 3. Linux下基本指令 3.9 mv 指令&#xff08;重点&#xff0…

借助ChatGPT撰写学术论文的10条规则

在撰写学术论文时,利用ChatGPT等人工智能工具可以显著提高写作效率和质量。以下是结合ChatGPT功能,为构建学术论文提出的10条规则,包括详细的专业说明和格式化的GPT提示词。 规则1:明确论文目标与核心问题 专业说明:确定研究的核心问题和目标是撰写论文的第一步。这有助…

如何通过可视化大屏,助力智慧城市的“城市微脑”建设?

在智慧城市的宏伟蓝图中&#xff0c;常常面临着一个关键挑战&#xff1a;如何确保这些理念和技术能够真正地惠及城市的每一个角落&#xff0c;每一个产业&#xff0c;以及每一位市民。问题的核心在于城市的具体应用场景&#xff0c;无论是横向的社区、园区、镇街、学校、酒店、…

PCB绘制

01-2-PCB的通孔、盲孔、埋孔_哔哩哔哩_bilibili 通孔&#xff1a;起点和终点肯定是最后一层和第一层 盲孔&#xff1a;起点永远是第一层&#xff08;或最后一层&#xff09;&#xff0c;终点肯定不是最后一层&#xff08;或第一层&#xff09; 埋空&#xff1a;起点和终点肯…

建筑物检测系统源码分享

建筑物检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Visio…

Python | Leetcode Python题解之第401题二进制手表

题目&#xff1a; 题解&#xff1a; class Solution:def readBinaryWatch(self, turnedOn: int) -> List[str]:ans list()for i in range(1024):h, m i >> 6, i & 0x3f # 用位运算取出高 4 位和低 6 位if h < 12 and m < 60 and bin(i).count("1&…

C# USB通信技术(通过LibUsbDotNet库)

文章目录 1.下载LibusbDotNet库2.引入命名空间3. 实例化USB设备4.发送数据5.关闭连接 1.下载LibusbDotNet库 右击项目选择管理NuGet程序包在弹出的界面中搜索LibusbDotNet&#xff0c;然后下载安装。 2.引入命名空间 using LibUsbDotNet; using LibUsbDotNet.Main;3. 实例化…

细数H.264 H.265 H.266区别

H.264、H.265&#xff08;HEVC&#xff09;和H.266&#xff08;VVC&#xff09;是三种不同的视频编码标准&#xff0c;它们在压缩效率、图像质量、支持的分辨率以及技术特性等方面存在显著差异。以下是对这三种编码标准的详细比较&#xff1a; 概述 H.264&#xff1a;也称为AV…

TCP全连接队列和tcpdump抓包

全连接队列 listen第二个参数 服务器在调用listen的时候&#xff0c;listen的第二个参数 1&#xff0c;就是TCP全连接队列的长度。 当客户端的连接进入established 状态后&#xff0c;如果服务器没有调用accept将连接取走&#xff0c;那么该连接就会待在TCP全连接队列中&a…

Edge浏览器设置夜间模式/深色模式

问题背景 普通白色背景感觉有点刺眼&#xff0c;想改成深色背景&#xff0c;但是默认的设置里面只能修改边框的颜色&#xff1a; 这里虽然设置界面和边框变成了黑色的&#xff0c;但是实际上打开网页还是白色的。 全局配置 在Edge浏览器打开edge://flags/&#xff0c;然后搜索D…

海垦集团养殖场分布式光伏发电项目中的案例分享

1客户需求 海南农垦集团&#xff0c;原海南省农垦总公司&#xff0c;是中央直属三大垦区之一。集团在海南有多个养殖场&#xff0c;包括红华养猪场、红华肉牛繁育场等&#xff0c;计划在这些养殖场的屋顶安装分布式光伏系统&#xff0c;用于自发自用和余电上网。红华养猪场和红…

基于ESP32S3的链接大语言模型对话模块

本实物模块从实物外观、模块组成、API申请及功能说明四部分来介绍这款基于ESP32S3的大语言模型对话模块。 1、实物外观 2、模块介绍 本硬件平台主要由三个模块组成&#xff0c;包括MAX9814录音模块、MAX98357音频功放模块和ESP32S3模块。如下图所示。 MAX9814录音模块&#…

mac 如何开启指定端口供外部访问?

前言 需要 mac 上开放指定端口&#xff0c;指定 ip 访问 解决 在 macOS 上开放一个端口&#xff0c;并指定只能特定的 IP 访问&#xff0c;可以使用 macOS 内置的 pfctl(Packet Filter)工具来实现。 1、 编辑 pf 配置文件&#xff1a; 打开 /etc/pf.conf 文件进行编辑。 可以使…

深度解读MySQL意向锁的工作原理机制与应用场景

意向锁 意向锁的概念 意向锁是InnoDB自动添加的一种锁&#xff0c;不需要用户去干预。 是数据库中的一种表级锁&#xff0c;一个事务要给一个资源加锁时&#xff0c;必须要先获取到对应类型的意向锁之后&#xff0c;才可以给这个资源加上自己想要的共享锁或者排他锁&#xff0…

【C++ 面试 - 新特性】每日 3 题(十一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

电容器制造5G智能工厂物联数字孪生平台,推进制造业数字化转型

在当今全球制造业的数字化转型浪潮中&#xff0c;电容器制造业作为电子元件的关键领域&#xff0c;正积极拥抱5G智能工厂与物联数字孪生平台技术&#xff0c;以推动生产效率的飞跃和产品质量的提升。这一创新模式不仅为电容器制造业注入了新的活力&#xff0c;也为整个制造业的…

植物三萜皂苷生物合成途径及调控机制研究进展-文献精读48

摘要 三萜皂苷(triterpenoids saponins)是由三萜皂苷元和一个或多个糖基和/或其他化学基团缩合而成的一系列结构多样的天然化合物[1], 主要分布在五加科、蝶形花科、石竹科、桔梗科、毛茛科、玄参科、葫芦科等植物中[2]. 植物中三萜皂苷常分布在特定的器官和组织, 如人参(Pana…