状态压缩DP——最短Hamilton路径

news2024/12/27 13:58:36

状态压缩DP——最短Hamilton路径

  • 一、题目描述
  • 二、思路分析
    • 1、状态转移方程
      • (1)状态表示——状态压缩
      • (2)状态转移
    • 2、循环和初始化
      • (1)循环设计
      • (2)初始化
  • 三、代码实现

一、题目描述

在这里插入图片描述

二、思路分析

1、状态转移方程

(1)状态表示——状态压缩

这道题的的规模大小取决于图中的点数,所以我们状态表示中肯定有一个变量表示的是当前到达的点 j j j。但是,我们还需要知道,到达点 j j j的时候,经过了哪些点,这样做的目的是,防止漏掉一个点或者是重复走了某个点。

我们可以把每个点是否走过用0和1表示,如果走过就是1,没走过就是0,然后这些01组成一个二进制数,然后这个二进制数的十进位表示作为我们状态转移的第二个参数 i i i

状态 i i i的二进制表示中,第0位表示0号点是否走过,第1位表示1号点是否走过,依次类推。

所以:
f ( i , j ) f(i,j) f(i,j)表示到达点 j j j的时候,经过了数字 i i i所表达的状态中的点,所需要的最短路程。

(2)状态转移

f [ i ] [ j ] = m i n ( f [ i ] [ j ] , f [ i − ( 1 < < j ) ] [ k ] + w [ k ] [ j ] ) f[i][j] = min(f[i][j], f[i - (1 << j)][k] + w[k][j]) f[i][j]=min(f[i][j],f[i(1<<j)][k]+w[k][j])
在这里插入图片描述
转移方程中的: i − ( 1 < < j ) i - (1 << j) i(1<<j)是为了保证不重复经过 j j j

2、循环和初始化

(1)循环设计

根据我们的转移方程,我们发现,我们遇到的子问题是状态 [ i − ( 1 < < j ) ] [i - (1 << j)] [i(1<<j)]

也就是说我们需要提前算出这个状态下的值。

所以外循环是我们经过的点的状态 i i i,内层是 j j j

如果我们反过来外层枚举 j j j,内层枚举状态 i i i。那么当我们的 k k k大于j的时候,此时的状态是没有被算出来的。所以这种枚举顺序是错误的。

(2)初始化

为了最小值,我们会将数组全初始化为正无穷。但是我们需要知道最小子问题的答案。那最小的子问题其实就是0号点到自身的路程,这个路程是0。
同时,由于经过了0号点,所以二进制的0号位是1,其余位置是0。
f [ 1 ] [ 0 ] = 0 f[1][0]=0 f[1][0]=0

三、代码实现

#include<iostream>
#include<cstring>
using namespace std;
const int N=21,M=1<<N;
int f[M][N],g[N][N];
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<n;j++)
            cin>>g[i][j];
    
    memset(f,0x3f,sizeof f);
    f[1][0]=0;
    for(int i=0;i<1<<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i>>j&1)
            {
                for(int k=0;k<n;k++)
                {
                    if((i-(1<<j))>>k&1)
                    {
                        f[i][j]=min(f[i][j],f[i-(1<<j)][k]+g[k][j]);
                    }
                }
            }
        }
    }
    cout<<f[(1<<n)-1][n-1]<<endl;
    return 0;
}

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

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

相关文章

(day1)自学java基础

非原创&#xff0c;记录学习过程&#xff0c;为方便自己后期复习 目录 1.Java基础概念 2.运算符 3.判断 4.循环 5.循环高级 6.数组 7.数组的内存图 8.方法 ctrlaltL 自动格式化代码 为什么要配置环境变量&#xff1f; 我们想在任意目录都可以打开指定软件&#xff0c;就…

DDR3 数据传输(四)

目录 引言 AXI从侧接口参数 AXI从侧接口信号 参考说明 引言 前文链接&#x

巧用网络指数

哈喽&#xff0c;好久不见&#xff01;今天我们来一起聊聊网络指数。网络指数平台是以网民在线使用行为数据为基础&#xff0c;借助关键词表达的重要信息检索渠道&#xff0c;一定程度上可以反映某一话题的关注度&#xff0c;也可以帮助我们抓住所谓的“热点”。这里&#xff0…

源码编译mindspore,利用云服务器与wsl

文章目录tmux的使用利用WSL2设置交换空间通过编译产生的output安装tmux的使用 参考&#xff1a;https://blog.csdn.net/weixin_43922901/article/details/89230499 参考&#xff1a;http://www.ruanyifeng.com/blog/2019/10/tmux.html tmux用于远程编译&#xff0c;开启一个会…

2023第一天,给你们展示一下用Python实现自动答题

前言 python实现自动答题&#xff1f; 别管&#xff0c;我这就给你们展示一下 &#xff08;效果图看不了 不知道为什么说我违gui&#xff09;&#x1f625; 话不多说&#xff0c;咱就直接看代码吧 代码 准备模块 import requests import parsel from selenium import webd…

create-vite 源码解析它来喽

create-vite的源码很简单&#xff0c;只有一个文件&#xff0c;代码总行数400左右&#xff0c;但是实际需要阅读的代码大约只有200行左右&#xff0c;废话不多说&#xff0c;直接开始吧。 代码结构 create-vite的代码结构非常简单&#xff0c;直接将index.ts拉到最底下&#…

项目学习--谷粒商城

1. 微服务搭建 本地安装虚拟机&#xff0c;静态IP划分和docker的使用微服务功能模块介绍以及业务模块划分与抽取 2. 前端搭建 3. 后端业务代码完善 云储存OSS的整合与使用JSR303校验以及自定义分组校验 4. Elasticsearch学习 Elasticsearch的基础使用Elasticsearch字段ma…

volatile 详解

1. 前言 在并发编程的过程中&#xff0c;volatile属性非常重要。首先我们要了解并发编程的三大特性&#xff1a;可见性, 有序性, 原子性而我们今天的了解的volatile 就牵扯到可见性, 有序性。同时我也会从个人了解的角度给大家分析下&#xff0c;如果有什么不对的地方也希望大家…

物联网与射频识别技术,课程实验(一)

目录 &#xff08;1&#xff09;communication.py &#xff08;2&#xff09;Reader.py &#xff08;3&#xff09;Tag.py 实验1—— EPC C1G2标准下的标签状态转换仿真 实验说明&#xff1a; 利用Python或Matlab模拟C1G2标签的状态转换模型&#xff1b; 程序应能显示标签…

深度学习:01 神经网络与激活函数

目前&#xff0c;最广泛使用的定义是Kohonen于1988年的描述&#xff1a; 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络&#xff0c;它的组织能够模拟生物神经系统对真实世界物体所做出的交互反应。 目录 对神经网络的概述 神经网络的表示 激活函数 为什么激…

2022年总结:从初二学生到算法作者的蜕变之路

目录 一年的创作历程 我和 CSDN 在编程竞赛的合作 About CBC 技术社区的发展 夜跑奇遇 About 博客之星 新年致谢 元旦祝福 一年的创作历程 2022年&#xff0c;这一年对于我来说是十分重要的一年。在这一年里&#xff0c;我作为一名初二在校学生&#xff0c;在CSDN上发布…

【Linux 环境变量】环境变量一般是指在操作系统中用来指定操作系统运行环境的一些参数

1.问题&#xff1a;为什么自己写的程序需要加上./才能执行&#xff0c;但是指令可以直接使用&#xff0c;例&#xff1a;ls -al&#xff1f; 因为&#xff1a;不加"./"执行程序的时候会按环境变量PATH里面的各个路径找到就正常执行&#xff0c;找不到就报错&#xff…

SQL笔试题总结

文章目录前言一、列转行题目&#xff1a;将表Student转化为下面的形式展示先放答案逐步剖析二、row_number() over() 的使用题目&#xff1a;统计订单交易表&#xff08;orders&#xff09;每个商品交易金额最高的那一条数据先放答案逐步剖析三、逐行累加题目&#xff1a;还是订…

✿✿✿JavaScript --- jQuery框架二

目 录 1.高级事件 (1)浏览器一打开自动触发我们绑定的事件 (2) Trigger 传递数据 (3)自定义事件 (4)trigger 简写方案 (5)triggerHandler() (6)trigger和triggerHandler的区别 (7)on off one 2.动画 (1)显示 隐藏 动画 (2)队列动画 (3)下滑 上卷 (4)淡入淡出…

Nacos启动出现Error creating bean with name ‘memoryMonitor‘ 、‘externalDumpService‘

目录 &#x1f9e1;问题 &#x1f9e1;解决方法 &#x1f49f;这里是CS大白话专场&#xff0c;让枯燥的学习变得有趣&#xff01; &#x1f49f;没有对象不要怕&#xff0c;我们new一个出来&#xff0c;每天对ta说不尽情话&#xff01; &#x1f49f;好记性不如烂键盘&#x…

WSL2支持systemctl命令

文章目录背景相关知识systemdinit安装方法一&#xff1a;微软官方支持方法&#xff08;推荐&#xff09;方法二&#xff1a;安装daemonize实现参考背景 微软官方推出Windows Terminal第一时间&#xff0c;我就安装了这个终端软件。现在GitHub已经有86.8k星&#xff0c;且发布了…

一名普通Java程序员的2022的总结和2023的展望

前言今天是元旦节&#xff0c;也是2023年的第一天&#xff0c;首先祝各位亲朋好友们元旦快乐&#xff0c;在新的一年全家身体康健&#xff0c;诸事顺遂&#xff0c;阖家幸福&#xff0c;最重要的是身体健康&#xff0c;工作顺利&#xff0c;永无BUG永不加班&#xff01;&#x…

计算机组成原理【1】初识硬件

目录 考点1&#xff1a;硬件发展———————————————————————————— 一.计算机硬件的基本组成 1.早期冯诺依曼机 &#xff08;1&#xff09;冯.诺依曼计算机的特点: 2.现代计算机的结构 3.总结图 二.各个硬件的工作原理 1.寄存器MAR,MDR 2.主存…

EMNLP22 外部知识注入:Prompt-Learning for Short Text Classification

Prompt-Learning for Short Text Classification 任务形式&#xff1a;短文本分类问题&#xff0c;但是短文本的短长度、特征稀疏性和高模糊性给分类任务带来了巨大挑战。 1以往的工作&#xff0c;在注入外部信息上 大多数提示学习方法手动扩展标签词或仅考虑类别名称以纳入…

得分_UVa1585分子量_UVa1586数数字_UVa1225周期串_UVa455子序列_UVa10340

目录 P57_习题3-1_得分_UVa1585 P57_习题3-2_分子量_UVa1586 原子数范围0~99 书上给的代码 P57_习题3-3_数数字_UVa1225 P57_习题3-4_周期串_UVa455 P59_习题3-9_子序列_UVa10340 P57_习题3-1_得分_UVa1585 给出一个由O和X组成的串&#xff08;长度为1&#xff5e;80&a…