zoukankan      html  css  js  c++  java
  • 3.4 熟练掌握动态规划——状态压缩DP

    从旅行商问题说起——

      给定一个图,n个节点(n<=15),求从a节点出发,经历每个节点仅一次,最后回到a,需要的最短时间。

    分析:

      设定状态S代表当前已经走过的城市的集合,显然,S<=(1<<n)-1.

      dp[k][s]——从a走到k,已经经历过的节点集合为s,按照规则走回a所需要的最短时间。

      初始化:dp[k][s]=-1

      

    int DP(int K,int S)
    {
    	if (dp[K][S]!=-1)
    	{
    		return dp[K][S];
    	}
    	if (K==a && S==(1<<n)-1)
    	{
    		//已经走回了A,并且所有点都走过一次
    		return dp[K][S]=0;
    	}
    	dp[K][S]=INF;
    	for (int i=0;i<adj[K].size();i++)
    	{
    		//枚举K的下一个点
    		int v=edges[adj[K][i]].to;
    		int dist=edges[adj[K][i]].dist;
    		if (!(S>>(v-1) & 1))//如果这个点还没有走过
    		{
    			int val=DP(v,S | (1<<(v-1)));
    			if (val!=INF)
    			{
    				dp[K][S]=min(dp[K][S],val+dist);
    			}
    		}
    	}
    	return dp[K][S];
    }
    

      

  • 相关阅读:
    7月18日实习日志
    第二周总结
    7月15日实习日志
    7月14日实习日志
    7月13日实习日志
    7月12日实习日志
    7月11日实习日志
    第一周总结
    7月8日实习日志
    小飞机工作笔记(一)方案简述
  • 原文地址:https://www.cnblogs.com/dandi/p/3995142.html
Copyright © 2011-2022 走看看