123

    划分状态的思维:    
    根据式子的特点。比如Max Sum。根据连续性。从而获得的是 dp[i] = max(a[i],dp[i-1]+a[i]);
    
    获得状态转移方程的思维:
    思维1:  去处法

          此时的状态描述往往是在这里到达目标所能XXX

正搜也就是所谓的记忆化搜索其实是DFS记录了状态下次遇到之后就能够直接返回数值。所以根据这个特点。大家的根源就是最后的那个终点。所以终点要初始化好    。并且先设置一个如果被搜索过就返回的特判语句。以及赋值表示这个点被搜索过了。而之前初始化的时候要作为没搜索过依据。

    思维2:  来源法

          此时的状态描述往往是到达该点所能XXX

从结果出发的思路拓展。也就是上述的逆思维吧。这个点的值要从哪里得到?这种思想。也就是说。比如题目WORM也就是这个点可以从它的左边和右边得到。然后从基本的出发。这个只要一个式子就行了。典型的DP做法。但是这个做法是有缺陷的。有些情况会还是考虑进去。后续有题目就是这个点。

    背包问题往往是后者。因为如果是搜索的话。并不易知道去向。

问题C 命运
 题目的设计其实是规定了你走路的方向dir这个很常见在dfs bfs那章节。比如那个骑士的走路问题。另外还有个问题就是记忆化搜索用栈不易实现。还是直接上比较简单    。这个问题问的是最大数值和。之后有问题总结:


问题E How many ways
这个路径真像卡特兰数啊。提到卡特兰就得想起那些例子以及编程之美上也有。
(原来编程之美略屌)权图第二类问题。就是方向控制上有点不同。另外这个如果用思维2的话是会超时的因为不能到的点还是重复地搜索。并且这个不好控制。因为你的搜索过程是没有规律的。或者说是不符合那个一直大的规律。并且标记也不好标记。所以记忆化在这里的优势真的是凸显出来了。方向是被规定的。


问法总结:
    问法一:方案数目。(如果是记忆化搜索末尾初始化为1).
    方程dp[i] += for(凡是能到达的点){dfs(这些点)的结果之和}
    问法二:数值上的和(之类)max或者min (如果是记忆化搜索就各点要初始化成map[i][j]).
    方程dp[i] = max or min (for(凡是能到达的点){dfs(这些点)})
    不同的情况 初始化数组是不同的。

问题K Max Sum
不得不说这个连续性保持得真的奇妙。多说点分析的废话。那就是如果我们状态划分成处理前i件物品中连续的序列的最大值会怎么样?
那么对于前 i 个物品的连续序列的最大值 问题。来源法。 就是前面所有的。dp 中的最大值。而且还得判别这个连续了没有。所以并不方便。、
并且值得注意的是。这个正确状态的描述。它的描述是以当前元素为结尾的连续序列的最大值!也就规定了是要最后扫一遍的。所以最后扫和不扫和状态划分很有关系。由这个引出的一系列连续性的问题。往往都是思维2来源法去思考划分。并且其实来源法在方向不明确的情况是非常好用的。 比如。上升序列问题。

dp[i] 代表到达该点所能获得的最长上升序列数。

来源法要综合考虑dp[i-1]的意义。否则你就是遍历前面所有了。如果当前元素大于(i-1的元素)这个i-1不是单纯的前面那个元素 是需要维护的元素。就dp[i-1]+1否者就是dp[i-1]呗。回去看下例题。

posted @ 2015-01-24 17:02  Milkor  阅读(160)  评论(0编辑  收藏  举报