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

123

时间:2015-01-24 18:34:23      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:



问题B Wrom
给我的想法:
    这个题目我觉得是最基础的搜索DP题了。
    给我的提示就是
    划分状态的思维:    
    根据式子的特点。比如Max Sum。根据连续性。从而获得的是 dp[i] = max(a[i],dp[i-1]+a[i]);
    
    获得状态转移方程的思维:
    思维1:正搜也就是所谓的记忆化搜索其实是DFS记录了状态下次遇到之后就能够直接返回数值。所以根据这个特点。大家的根源就是最后的那个终点。所以终点要初始化好    。并且先设置一个如果被搜索过就返回的特判语句。以及赋值表示这个点被搜索过了。而之前初始化的时候要作为没搜索过依据。

    思维2:从结果出发的思路拓展。也就是上述的逆思维吧。这个点的值要从哪里得到?这种思想。也就是说。做这个题目也就是这个点可以从它的左边和右边得到。然后从        基本的出发。这个只要一个式子就行了。典型的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 中的最大值。而且还得判别这个连续了没有。所以并不方便。

123

标签:

原文地址:http://www.cnblogs.com/Milkor/p/4246120.html

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