codevs售货员的难题 —— 状态压缩动态规划[四星]

本文介绍了如何使用状态压缩动态规划解决Codevs上的一个售货员最短路径问题。通过压缩状态并利用位运算进行转移,实现了从商店出发到所有村庄并返回的最短路程计算。文章包含详细的解释和示例代码。
摘要由CSDN通过智能技术生成

题目链接:戳我~

题目描述 Description

某乡有n个村庄,有一个售货员,他要到各个村庄去售货,各村庄之间的路程s是已知的,且A村到B村与B村到A村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短。请你帮他选择一条最短的路。

输入描述 Input Description

村庄数n和各村之间的路程(均是整数)

输出描述 Output Description

最短的路程

样例输入 Sample Input

3

0 2 1

1 0 2

2 1 0

样例输出 Sample Output

3

第一次打状压DP,以前只是听说不敢打…… 状压的思想核心还是比较易懂的
核心:
把状态压缩为一个二进制序列,用十进制保存,二进制中每一位都代表着不同的意义,比如说10,它的二进制是1010,可以理解为4号位和2号位的目标达成,1号和3号的目标没有达成。

压缩状态的目的是省空间,因为如果每一种状态开一个多维数组的话太占空间,并且转移也不好写,状压后转移写起来很方便,因为是二进制,主要通过位运算来实现它……


回到题目,看到n <= 15想到状压可以做,状压用在这里就是最外层从1for到2^n,这样就达到了枚举所有状态的目的,(具体实现详见代码),然后核心DP转移方程如下

dp[j][((1 << j-1) | i)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值