DP的启蒙
启蒙
DP的思想自从进入ACM队之后就有所了解,虽然偶尔做出过几道题,但是还是停留在“有所理解”的层次上。昨天做了HDU_5067,在聪明的卓君的教导下,突然感觉新世界的大门打开了……
思考
dp的思想并不复杂,总结起来就是状态转移。但是难就难在如何找到转移方程,如何用数组或者其它方式来表示状态。由于dp的题目很灵活,没有固定的模式,所以要把握思想,勤于思考,说不定能多过两道题。
题意
在一张地图上,有10个以内的特殊格子,现在你从1,1点出发,经过所有特殊点并返回1,1点。图中可以走回头路。求最少步数。
思路
思考半个小时就打算暴力dfs,反正就10个点,也就10!次计算呗。但是这不是最优解法。从dp的角度来思考这道题,看看能不能更好?
首先有10个点,可以用10位长的bit来表示当前状态,1表示第i个点已经走过了,0表示没走过。最多1024就能表示所有状态。这是第一维。
其次如何表示当前所选择的点呢?用第二维来表示当前状态最后经过的是第几个点,一共是10个点嘛。
组合dp[1<<10][10]的状态就能表示所有情况。例如dp[1001001001]4表示当前已经走过1,4,7,10这四个点,且最后一个点是4的状态下的最短路。
细节再算距离时,特殊的点1,1要把它普通化,详见代码。
AC代码
|
|