这是一道关于博弈的题目。
我从中得到如下的体会:
使用动态规划的方法来解答要比使用极大极小搜索算法,在速度上要快得多。
因为极大极小搜索策略每次都要对当前的局面进行某个最大深度的搜索,从中选取出最佳的走法。这样其实是非常耗时的。
由于这道题目的本身特点,如果使用动态规划的话,根据dp的思想就是保存搜索过程中的所有状态。在dp的搜索过程中,每次都是非常彻底的搜索,而且由于状态已经描述清楚并记录下来,如果产生了相同的状态,就可以直接使用,这样速度是很快的。但是从这道题目可以开出,dp中状态的描述需要进行保持程序设计的简单便捷,另外状态表一定要保持不会发生冲突情况。
我的一些理解:
/*
* POJ 1085 The Triangle War
* 题目注意:这道题中对于线段是谁放置的不关心,只要自己放置的线段形成一个完整的三角形就是获得了一次奖励
* 题目分析:
* 这道题目是关于博弈的搜索题,这里使用动态规划的思想来做,而动态规划的关键是状态的表示和存储。
* 由于游戏的局面状态变化总是和线段是否放置相关,于是可以这样来表达和记录局面状态,用二进制形式表示
* 线段,2^i表示第i条线段(i从0开始),这样的话,局面状态state也可以用线段二进制的或运算结果来表示了,而且
* 满足:0<= state < 2^18 。
* 这里还需要注意的是状态表f[state]中记录的是对于当前局面state,某一方先走,然后双方都采取最优策略,最终双方
* 所拥有的新产生的三角形个数的差值
*/
从这道题目中,可以看出动态规划表存储值的定义需要实现明确的。
下面是转载的这道题的dp搜索方法的代码。(感谢: 熊鹏 ID:twilightgod)