什么是状态压缩DP???

1. 引言

相信大家已经对普通的01背包或者其他背包问题已经很熟练了,但是有时候我们去解决NP问题(指数级别的复杂度,比如N!),时间复杂度就会非常之大

所以,这个时候我们需要寻找更加优化的方法,来优化DP

状态压缩也是一种DP优化方法

2. 什么是状态压缩?

状态压缩:是一种优化动态规划算法的技术,通常用于解决具有大量状态的问题,以减少内存消耗和提高计算效率。在动态规划问题中,状态通常是指描述问题的各种情况或者组合的变量,而状态压缩就是通过一种巧妙的方式来表示和存储状态,从而减少内存消耗。

也就是说,当DP状态是集合的时候,把集合的组合或者排列用二进制进行表示,这个二进制01组合表示集合的的一个子集 , 可以将DP状态的处理转成为二进制的位操作,能够提高算法的效率

当一个DP具有以下特征的时候,就适合用状态压缩了:

  1. 状态之间存在某种转移关系,但状态数量巨大。
  2. 状态之间的转移可以通过位运算来表示。
  3. 状态之间的转移关系可以通过枚举子集或者排列组合的方式来计算。

3. 引子

现在,我们来看一道经典问题,一起学习什么是状态压缩。

给定一张 n个点的带权无向图,点从 0∼n−1标号,求起点 0到终点 n−1 的最短 Hamilton 路径。

Hamilton 路径的定义是从 0到 n−1不重不漏地经过每个点恰好一次。

输入格式
第一行输入整数 n。

接下来 n行每行 n个整数,其中第 i行第 j个整数表示点 i到 j的距离(记为 a[i,j])。

对于任意的 x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x] 并且 a[x,y]+a[y,z]≥a[x,z]。

输出格式
输出一个整数,表示最短 Hamilton 路径的长度。

数据范围
1≤n≤20

0≤a[i,j]≤107

输入样例:
5
0 2 4 5 1
2 0 6 5 3
4 6 0 8 3
5 5 8 0 5
1 3 3 5 0


输出样例:
1

Hamilton(旅行商)是一个NP问题,N个点的全排列,时间复杂度是n!这是非常之大的。

有人看到最短路或许会无脑dijkstra, 但是对于dijkstra求最短路是并没有考虑每个点的

这道题的难度就在每个点都需要访问一次,所以并不能适用

就算使用回溯搜索,那也非常大的时间复杂度

4. DP求解Hamilton问题

4.1 状态定义

如何进行DP状态定义,这是我们首要解决的

DP问题,无非就是从小问题递推到大问题,那么我们可以这样进行dp定义:

dp[s][j]:代表在S集合内,到达j点的最短距离(j也在S集合内,因为每个点都需要到达)

我们可以通过子集然后递推求出大集合

4.2 属性定义

这道题很明确,其实就是求最小值,也就是min

4.3 状态转移

从集合S到j点的最短距离,无非就是需要从前面的集合开始入手

我们可以从小问题S-j递推到大问题S

S-j:代表从集合S中去除j点的集合

如何从S-j递推到S又是一个难题,我们可以设k为S-j中的一个点,把0~j 分为两个部分:

第一部分就是:0->k , 第二部分是k->j

我们先到k点,然后从k点到j点,于是就有了以下状态转移方程式

dp[S][j] = min(dp[S - j][k] + dist[k][j])

dist[k][j]:k到j的距离

这个地方会比较难以理解,但是要清楚:DP就是从小问题递推到大问题

我们要求S集合内到达j点的最短路,无非就是要从S中把j点去除,然后通过中间的那些点作为媒介,一个一个递推到S -> j

 5. 代码

知道这些,我们可以开始编码了:

解析:

  • 状态压缩,是将一个二进制数表示一个集合S,二进制的每一位都代表图上的每一个点。
  • 对于二进制位每一位来说,有1就代表全都有,比如n = 5时,二进制为:11111 , 也就代表这个集合里面有1、2、3、4、5几个点
from math import *

n = int(input())

dist = [[0] * (n + 1) for i in range(n + 1)]    # 两个点之间的距离
for i in range(n):
    a = list(map(int, input().split()))
    for j in range(len(a)):
        dist[i][j] = a[j]

# 集合S到j的最短距离 , 这里的1 << 20是因为题目的范围是1 - 20 , 最大只有20个点,通过位运算的形式,将这21个点转为集合
dp = [[inf] * (n + 1) for i in range(1 << 20)]   # 初始化都是最大的


dp[1][0] = 0  # 最开始,集合里面只有一个0点
for s in range(1 << n):    # 二进制总共的位数
    for j in range(n):
        if (s >> j) & 1:   # 判断j是否在S中
            for k in range(n):
                if (s ^ (1 << j)) >> k & 1:   # 判断k是否在S除去j里面

                    dp[s][j] = min(dp[s][j], dp[s ^ (1 << j)][k] + dist[k][j])  # 状态转移方程

print(dp[(1 << n) - 1][n - 1]) 

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

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

相关文章

数据结构算法 - 数组 Array

一、概念 结构是一种线性表&#xff08;元素排列成直线的结构&#xff09;&#xff0c;创建数组会开辟一块连续的内存空间&#xff0c;长度固定无法更改&#xff0c;元素可以重复且只能是同一种类型&#xff08;Object类型数组除外&#xff09;。优点查询快&#xff1a;由于元…

对话奇酷网络董事长吴渔夫: 迟到的游戏公司会被AI浪潮卷入海底

“ 迟到的游戏公司会被无形的 AI 浪潮卷入海底。” 整理 | 梦婕 编辑 | 云舒 出品&#xff5c;极新 2024年3月4日&#xff0c;在极新与吴渔夫的对话中&#xff0c;吴渔夫多次呼吁“全力拥抱AI”。在这场AI浪潮中&#xff0c;作为中国网游的先锋&#xff0c;他带着 25 年“中…

外包干了1个月,技术明显进步。。。

我是一名大专生&#xff0c;自19年通过校招进入湖南某软件公司以来&#xff0c;便扎根于功能测试岗位&#xff0c;一晃便是近四年的光阴。今年8月&#xff0c;我如梦初醒&#xff0c;意识到长时间待在舒适的环境中&#xff0c;已让我变得不思进取&#xff0c;技术停滞不前。更令…

GraalVM:新一代跨语言虚拟机的崛起

有朋友后台私信让聊聊GraalVM&#xff0c;目前这玩意我只自己尝鲜搞过&#xff0c;没搞过线上&#xff0c;后续有机会会补充个实践 其实&#xff0c;随着信息技术的快速发展&#xff0c;编程语言多样化已成为软件开发领域的常态。为了满足不同编程语言间的互操作性和性能需求&a…

Java特性之设计模式【组合模式】

一、组合模式 概述 组合模式&#xff08;Composite Pattern&#xff09;&#xff0c;又叫部分整体模式&#xff0c;是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象&#xff0c;用来表示部分以及整体层次。这种类型的设计模式属于结构型模式&#x…

隐私计算实训营学习一:数据可信流通,从运维信任到技术信任

文章目录 一、数据可信流通二、数据可信流通的技术信任基础三、技术信任开启数据密态时代&#xff0c;保障广域数据可信流通 一、数据可信流通 可信数据流通体系&#xff1a;数据二十条第一次明确提出可信流通&#xff0c;建立数据来源可确认、使用范围可界定、流通过程可追溯…

金融知识分享系列之:支撑阻力

金融知识分享系列之&#xff1a;支撑阻力 一、支撑阻力原理二、支撑阻力作用1.识别市场资金的预期2.作为入场和平仓的重要参考 三、寻找支撑阻力四、延伸思考五、支撑阻力总结 一、支撑阻力原理 支撑阻力核心要素&#xff1a; 锚定效应订单驱动 支撑阻力原理&#xff1a; 市…

在DevEco Studio中第一次使用网络图片不显示问题

当我们新建项目 第一次使用网络图片 没有显示时 加这段代码就可以了 如果刷新图片还是没有显示 就重启编辑器。 "requestPermissions": [{"name": "ohos.permission.INTERNET"}],

>>Vue3+pinia+echarts等实现疫情可视化大图

一.>>前言 1.这个项目是在小满实战篇可视化&#xff08;第九章-饼图&#xff09;_哔哩哔哩_bilibili 这一系列课程为基础来做的&#xff0c;真的很感谢小满老师&#xff0c;讲的内容干货满满&#xff0c;暂时解决了手上没有项目的难题。大家可以去观摩一下他的优质课程。…

WT32-ETH02 plus 串口转以太网开发,WT32-ETH01网关开发板升级款!

广受欢迎的WT32-ETH01网关开发板迎来了升级。 就是这款启明云端新推出的嵌入式串口转以太网开发板——WT32-ETH02 plus。应广大客户的需求&#xff0c;在WT32-ETH01的基础上增加了POE供电&#xff0c;可广泛应用于智能家居和网关等应用。开发板搭载2.4GHz Wi-Fi和蓝牙双模的SO…

PyTorch 深度学习(GPT 重译)(五)

十二、通过指标和增强改进训练 本章涵盖 定义和计算精确率、召回率以及真/假阳性/阴性 使用 F1 分数与其他质量指标 平衡和增强数据以减少过拟合 使用 TensorBoard 绘制质量指标图 上一章的结束让我们陷入了困境。虽然我们能够将深度学习项目的机制放置好&#xff0c;但实…

shell编程入门(笔记)

1、shell编程基础&#xff1a; 1.1、shell的解释执行功能 1.2、什么是shell程序&#xff1f; 1.3、shell程序编程的主要内容 1.4、shell程序的第一行 1.5、变量要求 1.6、环境变量和只读变量 1.7、位置参量 1.8、位置参量列表 1.9、数组 2、输入输出 2.1、输入-read命令 2.2…

Linux命令du详解

目录 du是什么&#xff1f;du 命令的格式常用的选项速查选项详解及例子du [目录/文件]-a-d-h-s-c--timeformatfull-isolong-isoiso -t 或 --thresholdSIZE --excludePATTERN--si-0 或--null--apparent-size-B size 或--block-sizesize-b 或--bytes-k-m-L 或 --dereference-l 或…

C++类和对象基础

目录 类的认识 访问限定符&#xff1a;public(公有)&#xff0c;protected(保护)&#xff0c;private(私有)。 类的两种定义方式: 类的实例化&#xff1a; 封装&#xff1a; 类的对象大小的计算&#xff1a; 类成员函数的this指针&#xff1a; C语言是面向过程的语言&am…

洛谷_P1605 迷宫_python写法

P1605 迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) dfs代码&#xff1a; 这道题也是简单的深搜问题&#xff0c;但是要注意地图的原点记得要初始化maps[sx-1][sy-1] 1 n, m, t map(int,input().split()) sx, sy, fx, fy map(int,input().split()) maps [[0 for _ i…

Java反射:深入解析与实战应用

在Java编程的世界中&#xff0c;反射机制是一种强大的工具&#xff0c;它允许程序在运行时检查和操作类、接口、字段和方法的信息。通过反射&#xff0c;我们可以实现许多高级功能&#xff0c;如动态代理、框架设计等。本文将深入探讨Java反射的基本概念、使用方法以及在实际项…

APP稳定性测试工具:Monkey

一、Monkey 简介 Monkey 是一款 app 的自动化测试工具&#xff0c;monkey 是猴子的意思&#xff0c;所以从原理上说&#xff0c;它的自动化测试就类似猴子一样在软件上乱敲按键&#xff0c;猴子什么都不懂&#xff0c;就爱捣乱。Monkey 原理也是类似&#xff0c;通过向系统发送…

多模态大语言模型的 (R) 演变:调查

目录 1. Introduction2. 赋予LLMs多模态能力2.1 大型语言模型2.2 视觉编码器2.3 视觉到语言适配器2.4 多模式训练 3. 使用 MLLM 处理视觉任务 连接文本和视觉模式在生成智能中起着至关重要的作用。因此&#xff0c;受大型语言模型成功的启发&#xff0c;大量研究工作致力于多模…

Jmeter接口测试步骤

一、使用工具测试 1、使用Jmeter对接口测试 首先我们说一下为什么用Posman测试后我们还要用Jmeter做接口测试&#xff0c;在用posman测试时候会发现的是一个接口一个接口的测试&#xff0c;我们每次测试成功后的数据&#xff0c;在工具中是无法保存的&#xff0c;再次测试的时…

STM32CubeMX学习笔记23---FreeRTOS(任务的挂起与恢复)

1、硬件设置 本实验通过freertos创建两个任务来分别控制LED2和LED3的亮灭&#xff0c;需要用到的硬件资源 LED2和LED3指示灯串口 2、STM32CubeMX设置 根据上一章的步骤创建两个任务&#xff1a;STM32CubeMX学习笔记22---FreeRTOS&#xff08;任务创建和删除&#xff09;-CS…