码迷,mamicode.com
首页 > 其他好文 > 详细

3.4 熟练掌握动态规划——状态压缩DP

时间:2014-09-24 16:37:07      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:blog   for   div   问题   c   log   amp   ad   size   

旅行商问题:

  给定一个N节点组成的带权有向图的距离矩阵D(i,j)(INF--没有边),求从定点0出发,经过每个节点恰好一次再返回节点0,所经过的边的权值最小为多少?

范围:

  2<=n<=15

dp[k][status]——到达k节点时,已经走过的点的集合为status的最佳答案,status是一个二进制数字表示集合。

利用记忆化搜索的方法进行求解

//正确答案为DP(0,(1<<n)-1)
int DP(int K,int Status)//到达节点K并且已经走过的节点集合为Status的最优值,节点从0开始(0...N-1)
{
	if (dp[K][Status]!=INF)
	{
		return dp[K][Status];
	}
	//枚举K可到的且存在于Status里的节点V
	
	for (int i=0;i<adj[k].size();i++)
	{
		edge &e = Edges[adj[k][i]];
		int dist = e.dist;
		if ((Status<<e.to)&&1)
		{
			dp[K][Status]=min(dp[K][Status],dp[e.to][Status XOR (1<<e.to)]+dist);
		}
	}
	
	return dp[K][Status];
}

  

3.4 熟练掌握动态规划——状态压缩DP

标签:blog   for   div   问题   c   log   amp   ad   size   

原文地址:http://www.cnblogs.com/dandi/p/3990644.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!