TSP与动态规划
Travelling Salesman Problem (TSP) 是最基本的路线问题。它寻求的是旅行者由起点出发,通过所有给定的需求点后,再次返回起点所花费的最小路径成本,也叫旅行商问题、旅行推销员问题、货郎担问题……
**动态规划算法(Dynamic Programming,简称DP)**通常用于求解具有某种最优性质的问题,其基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后由这些子问题的解再得到原问题的解。比如跳两格退一格的问题、给定一根绳子剪短乘积最大的问题等……
状态压缩动态规划
状态压缩动态规划,就是我们俗称的状压DP,是利用计算机二进制的性质来描述状态的一种DP方式。假设有5盏灯,编号为0,1,2,3,4,有点亮和熄灭两种状态,如果以二进制数来表示所有可能的状态,则0,1,4亮,2,3熄灭表示为
比特位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|
二进制值 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 |
状态 | null | null | null | on | off | off | on | on |
显然,状压是一种暴力的方法,当数量很大时状态也会增多。在旅行商问题中将以0,1来标记是否走过的点。
位运算
在代码实现中将会用到位运算来实现状态的判断。下面例举常见的几个位运算:
运算符 | 示例 | 说明 |
---|---|---|
& | x&y | 以二进制数的形式按位与,返回其对应的十进制 |
| | x|y | 以二进制数的形式按位或,返回其对应的十进制 |
^ | x^y | 以二进制数的形式按位异或,返回其对应的十进制 |
<< | x<<y | 将x每一位左移y位,1<<n相当于 2 n 2^n 2n |
>> | x>>y | 将x每一位右移y位,1>>n相当于 1 / 2 n 1/2^n 1/2n |
常见的应用:
1.判断一个数字x二进制下第i位是不是等于1。
方法: i f ( ( ( 1 < < ( i − 1 ) ) & x ) > 0 ) if(((1<<(i−1))\&x)>0) if(((1<<(i−1))&x)>0)
将1左移i-1位,相当于制造了一个只有第i位上是1,其他位上都是0的二进制数。然后与x做与运算,如果结果>0,说明x第i位上是1,反之则是0。
2.将一个数字x二进制下第i位更改成1。
方法: x = x ∣ ( 1 < < ( i − 1 ) ) x=x|(1<<(i−1)) x=x∣(1<<