Acwing.731 毕业旅行问题(状态压缩动态规划)

题目

小明目前在做一份毕业旅行的规划。

打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次。

由于经费有限,小明希望能够通过合理的路线安排尽可能的省些路上的花销。

给定一组城市和每对城市之间的火车票的价钱,找到每个城市只访问一次并返回起点的最小车费花销。

注意:北京为 1号城市。

输入格式

第一行包含一个正整数 n,表示城市个数。

接下来输入一个 n 行 n列的矩阵,表示城市间的车票价钱。

输出格式

输出一个整数,表示最小车费花销。

数据范围

1<n≤20
包括北京
车票价格均不超过 1000元。

  • 输入样例:
4
0 2 6 5
2 0 4 4
6 4 0 2
5 4 2 0
  • 输出样例:
13

说明

共 4个城市,城市 1和城市 1的车费为 0,城市 1和城市 2之间的车费为 2,城市 1和城市 3之间车费为 6,城市 1和城市 4之间的车费为 5,以此类推。

假设任意两个城市之间均有单程票可买,且价格均在 1000元以内,无需考虑极端情况。

题解

import java.util.Arrays;
import java.util.Scanner;/*** @author akuya* @create 2024-04-01-20:00*/
public class Main {static int N=20;static int M=1<<N;static int n;static int INF=0x3f3f3f3f;static int w[][]=new int[N][N];// f[i][j]:当前走过的城市状态为 i,且最后一个停留的城市是 j的最小花费static int f[][]=new int[M][N];
;    public static void main(String[] args) {Scanner scanner =new Scanner(System.in);n=scanner.nextInt();for(int i=0;i<n;i++){for(int j=0;j<n;j++)w[i][j]=scanner.nextInt();}for(int i=0;i<M;i++){Arrays.fill(f[i],INF);}f[1][0]=0;// 开始在 0号点,状态集合是 000..001(最后一个点是0),合法状态for(int i=1;i<1<<n;i+=2){for(int j=0;j<n;j++){if((i>>j&1)==1){for(int k=0;k<n;k++){if((((i-(1<<j))>>k)&1)==1){//i去掉第 j位后还有第 k位// ..... -> k -> j    经过 k之后再经过 jf[i][j]=Math.min(f[i][j],f[i-(1<<j)][k]+w[k][j]);}}}}}int res=INF;for(int i=1;i<n;i++){// 最后一定是f[111...1111][?]    ?是除了 0以外的点res=Math.min(res,f[(1<<n)-1][i]+w[i][0]);}System.out.println(res);}
}

思路

这道题是一道典型的动态规划问题,但如何设计状态数组是个问题,根据经验,没错根据经验,动态规划问题的状态数组的设计需要经验,这个靠刷题积累,这道题采用状态压缩来设计状态数组,具体如下图。i为当前已经走过的城市,j为目前所在的城市。

在这里插入图片描述

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

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

相关文章

如何在 Debian VPS 上添加、删除和授予用户 sudo 权限

简介 当你启动一个新的服务器时&#xff0c;会创建一个名为 root 的默认账户。这个用户拥有完全的系统访问权限&#xff0c;应该仅用于管理任务。作为 root 用户&#xff0c;你基本上可以对系统做任何操作&#xff0c;这很强大&#xff0c;但也极其危险。Linux 没有“撤销”按…

Leetcode 73 矩阵置零

题目信息 LeetCode地址: . - 力扣&#xff08;LeetCode&#xff09; 题目理解 矩阵是m*n的&#xff0c;如果某个元素(i,j)等于0&#xff0c;则将第i行和第j列的所有元素都置零。既然如此&#xff0c;我们可以便利每一个元素&#xff0c;并记录下哪一行哪一列有零。记录完毕后…

【C++进阶】二叉搜索树(来自二叉树的复仇)

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;c大冒险 总有光环在陨落&#xff0c;总有新星在闪烁 [本节目标] 1. 二叉搜索树…

KaTex 常用公式编辑

原文&#xff1a;https://blog.iyatt.com/?p7854 注&#xff1a;语法上和 Latex 差不多一样&#xff0c;我是因为 WordPress 上使用 WP Githuber MD 插件&#xff0c;才用的 KaTex&#xff08;插件里面的 LaTex 模块有 bug&#xff0c;无法渲染&#xff09; 希腊字母 大写代…

MyBatis 参数重复打印的bug

现象 最近有个需求&#xff0c;需要在mybatis对数据库进行写入操作的时候&#xff0c;根据条件对对象中的某个值进行置空&#xff0c;然后再进行写入&#xff0c;这样数据库中的值就会为空了。 根据网上查看的资料&#xff0c;选择在 StatementHandler 类执行 update 的时候进…

C++之调用Python

1、配置头文件 Python安装目录下的include目录加入头文件目录。Visual Studio2022中操作路径是&#xff1a;属性–> C/C -> 常规-> 附加包含目录 C:\Users \AppData\Local\Programs\Python\Python39\include 2、配置lib库目录 要将Python39.lib加入编译链接。Visua…

neo4j使用详解(七、cypher数学函数语法——最全参考)

Neo4j系列导航&#xff1a; neo4j及简单实践 cypher语法基础 cypher插入语法 cypher插入语法 cypher查询语法 cypher通用语法 cypher函数语法 5.数学函数 5.1.数值函数 数学函数仅对数字表达式进行运算&#xff0c;如果对任何其他值使用&#xff0c;将返回错误 abs()&#xf…

Nginx 基础

文章目录 Nginx概念安装下载上传安装包执行准备条件指定安装位置编译和安装启动服务创建启动脚本 linux文件目录nginx运行原理nginx配置域名概念和原理域名配置 Nginx 概念 Nginx 是一个高性能的HTTP和反向代理web服务器&#xff0c;同时也提供了IMAP/POP3/SMTP服务。Nginx是…

【Java八股面试系列】Arraylist和HashMap的底层原理

文章目录 ArrayList源码总&#xff1a;构造方法扩容机制remove HashMap总&#xff1a;构造方法细节问题putVal()方法resize()方法Hash值 HashMap常见问题 ConcurrentHashMap总&#xff1a;putVal()方法自己的测试 为什么重写HashCode和equals ArrayList源码 总&#xff1a; *…

3.28号arm

can总线相关理论 1. 概念 控制器局域网&#xff08;Controller Area Network&#xff0c;CAN&#xff09;&#xff0c;其特点是可拓展性好&#xff0c;可承受大量数据的高速通信&#xff0c;高度稳定可靠&#xff0c;因此常应用于汽车电子领域、工业自动化、医疗设备等高要求…

Java JSON字符串相关问题

一、依赖包 <!--json包--><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.15</version></dependency> 二、举例 1.实体对象转Json字符串 1.1 代码实现 Dog.java: pack…

python_web1(前端开发之HTML、CSS、Bootstap、Javascript、JQuery)

文章目录 一、Flask网页开发1.1创建一个名为web1.py的python文件1.2 templates目录创建文件index.html 二、html标签2.1 编码2.2title < head >2.3 标题< h>2.4 div和span2.5超链接1.在index.xml文件中补充。2.修改web1.py文件3.添加get_self.html4.效果 2.6图片1.…

Java 堆外内存及调优

文章目录 直接内存简介为什么DirectByteBuffer可以优化 IO 性能 直接内存的分配直接内存的回收直接内存跟踪与诊断 直接内存简介 直接内存(Direct Memory) 并不是虚拟机运行时数据区的一部分&#xff0c;并非Java虚拟机规范中定义的内存区域。但是这部分内存的频繁使用&#x…

ElasticSearch的DSL查询

ElasticSearch的DSL查询 准备工作 创建测试方法&#xff0c;初始化测试结构。 import org.apache.http.HttpHost; import org.apache.lucene.search.TotalHits; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchRespo…

AcWing22. 旋转数组的最小数字

把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。 输入一个升序的数组的一个旋转&#xff0c;输出旋转数组的最小元素。 例如数组 {3,4,5,1,2}为 {1,2,3,4,5} 的一个旋转&#xff0c;该数组的最小值为 1。 数组可能包含重复项。 注意&#x…

【LeetCode】三月题解

文章目录 [2369. 检查数组是否存在有效划分](https://leetcode.cn/problems/check-if-there-is-a-valid-partition-for-the-array/)思路&#xff1a;代码&#xff1a; [1976. 到达目的地的方案数](https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/) 思路…

C++教学——从入门到精通 5.单精度实数float

众所周知&#xff0c;三角形的面积公式是(底*高)/2 那就来做个三角形面积计算器吧 到吗如下 #include"bits/stdc.h" using namespace std; int main(){int a,b;cin>>a>>b;cout<<(a*b)/2; } 这不对呀&#xff0c;明明是7.5而他却是7&#xff0c;…

ntp服务器搭建

1、手动修改时区 CST可以为如下4个不同的时区的缩写&#xff1a; 美国中部时间&#xff1a;Central Standard Time (USA) UT-6:00 澳大利亚中部时间&#xff1a;Central Standard Time (Australia) UT9:30 中国标准时间&#xff1a;China Standard Time UT8:00 古巴标准时间&a…

二分查找算法刷题记录 -LC34

前言 接上文&#xff0c;本文记录LC34 排序数组中查找元素的第一个和最后一个位置题解。 该题是基于LC704的拓展题&#xff0c;也是二分查找的各个细节点所在&#xff0c;做透这个题&#xff0c;二分查找的题基本上都可以解决。 正文 在做本题前&#xff0c;请确保你已经掌…

让IIS支持.NET Web Api PUT和DELETE请求

前言 有很长一段时间没有使用过IIS来托管应用了&#xff0c;今天用IIS来托管一个比较老的.NET Fx4.6的项目。发布到线上后居然一直调用不同本地却一直是正常的&#xff0c;关键是POST和GET请求都是正常的&#xff0c;只有PUT和DELETE请求是有问题的。经过一番思考忽然想起来了I…