zoukankan      html  css  js  c++  java
  • 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]呗。回去看下例题。

  • 相关阅读:
    Solutions:Elastic SIEM
    Solutions:Elastic SIEM
    Solutions:Elastic SIEM
    Elasticsearch:设置Elastic账户安全
    Beats:通过Metricbeat实现外部对Elastic Stack的监控
    Kibana: 运用Data Visualizer来分析CSV数据
    Kibana:在Kibana中对数据进行深入分析
    Kibana:Canvas入门
    Elastic:创建你的第一个Elastic alert
    Elasticsearch:跨集群搜索 Cross-cluster search (CCS)
  • 原文地址:https://www.cnblogs.com/Milkor/p/4246120.html
Copyright © 2011-2022 走看看