poj 2288(状态压缩dp + TSP问题)

题目描述:哈密尔顿路问题。n个点,每一个点有权值,设哈密尔顿路为 C1C2...Cn,Ci的权值为Vi,一条哈密尔顿路的值分为三部分计算:

1.每一个点的权值之和
2.对于图中的每一条CiCi+1,加上Vi*Vi+1
3.对于路径中的连续三个点:CiCi+1Ci+2,若在图中,三点构成三角形,则要加上Vi*Vi+1*Vi+2

求一条汉密尔顿路可以获得的最大值,并且还要输出有多少条这样的哈密尔顿路。


解题思路:这道题比一般的TSP问题要复杂一点,因为要考虑三个连续的点。而且还要记录路径条数。

我设了一个四维数组dp[s][i][j][k],表示状态为s,且最后三个点是i->j->k的最大值。然后状态转移方程很简单。要注意运算符的优先级问题,害死人!!!

怎么计数就不多说了,参考的网上的,不过这里四维会爆内存。。

实际上网上很多人都是三维就够了,确实没有必要知道三个点,知道两个点反正可以推出第三个点来。

参考博客:http://www.cnblogs.com/jackge/archive/2013/05/24/3096162.html

这题就不写代码了。。

你可能感兴趣的:(dp)