• 高神 SHU 3.12 DP2 总结


    /*******废话部分******

    发现自己做以前会的题都忘了,所以要好好总结一下,减少遗忘。

    */

    /*****搜索引擎优化部分*****

    高神 高神 高神 高神 高神 高神 高神 高神 高神

    */

    这个专题是高神开的DP2,都是高神精心挑选的题,要认真刷。

    高神开的DP2比赛链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=71636#overview

    密码:shuacm

    A – Barcode

    题意:给你一张n*m的图,让你把它变成一张类似条形码的图,其中白色和黑色部分都要在[x,y]之间。

    解法:两个状态,分别为当前列和当前颜色,保存所需的最小代价。这样就可以实现了。

    总结:尽量用少的状态来实现。

    B - Porcelain

    题意:给你n个架子,每个架子只能从左右拿出物品。问拿出k个物品,所能取得的最大值。

    解法:分步骤:第一步先求出只在一个架子取出k个的最大值。

                  第二步类似0-1背包,递推架子,求出最大值

    总结:碰到困难的问题,分布来实现。

    C – Camels

    题意:给你n个点,k个驼峰,求出可能的种数。(驼峰只能由1,2,3,4组成)

    解法:因为驼峰,驼谷由三个状态组成 ,至少需要保存前两个状态。

    四个状态:当前点序号  i-1  i  第几个驼峰

    总结: 充分利用题目信息来Dp,不要自己想乱七八糟状态。

    D - DZY Loves Sequences

    题意:给你一个长n的序列,求最长连续上升子序列。允许修改一个值。

    解法:第一步先求出不允许修改的递推。第二步再找出允许修改递推。

    总结:先实现简单,再实现复杂一些状态。

    E - Wall Bars

    题意:建造一个梯子,使得人能够爬到最上面h个中的任意一个。梯子长n,有四个方向,人一步最多h长。

    解法:任意选一个方向,旋转4次,从而DP。

                  四个状态记录的是同方向离它最近的距离。

                  其中一个为当前的方向,可以省略记为可达和不可达,也就是两个状态。

    总结:根据题目信息来分状态。这种方向不确定的,可以任意假定一个状态,再DP。不能单纯的乘以4,因为会有重复的状态出现,还需要去重。

    F - Positions in Permutations

    题意:求一个1-n的全排列中,友好度恰好为k的序列有多少个。友好的定义:|A[i]-i|=1;

    解法:要使一个位置友好,必须填的是i-1 或 i+1

             第一步:先求出正好满足k个位置为友好的方案数。不考虑剩余的n-k个位置。(假设在位置i的数 在不填充 i-1 或 i+1时存在可以填充其他值)

              状态为:   当前位置 ,k, i , i+1    然后进行DP

             第二步:第一步假设前提下,F[k]=D[n][k][][] *fac(n-k) 即为大于等于k个友好的方案数。

        而要求的是恰好为k个友好的方案数。最基本的想法是F[k]-F[k+1],但是这样是错的。因为这是在假定前提下实现的。假定不一定成立的。

        也就说F[k]的值是大于前面所说的“大于等于k个友好的方案数”,因为多包含了一些本来应该算作是F[k+1]的方案。

          如 n=2,k=1;

          全排列为:1 2

                      2 1

          F[1]=2;

          F[2]=1;

        但是事实F[1]=0,不满足假设的条件;

          既然会有不满足的,就反其道行之直接减去所有可能不满足的即可。

               设Ans[k]为恰好为k个友好的方案数,即题目所求。

               因为计算时假设在位置i的数 在不填充的i-1 或 i+1时存在可以填充的其他值,

          那么减去时也假设在位置i的数 在不填充的i-1 或 i+1时存在可以填充的其他值,

          这样就相互抵消了。

        然后继续递推就可以求解了。

    总结:神一样的思路。这个看智商的……以后继续跪。

    G - Sereja and Subsequences

    题意:给一个长度为n 的数组。可以求所有的不同的非递减子序列。

    对于每个非递减序列,求出和它长度相等,且字典序小于等于它的个数。问总共的个数。

    解法:其中有个关键点是不同的非递减序列。要实现不同的非递减序列,可以先根据他们的ID[ i ]排序,这样就可以避免重复的问题。

    接下来用树状数组来实现log(n)的递推。

    总结:神一样的思路。碰到“不同的”子序列,可以往树状数组方向考虑一下。

  • 相关阅读:
    java springboot连接两个数据源
    Android状态栏高度、虚拟操作栏高度
    Java代码实现两种数据库的数据迁移
    微信小程序生成海报
    【比较耗性能的一个东西】Firefox的LayoutReflow
    JS中关于带操作赋值的一个小问题
    js控制样式一个细节
    javascript中打开客户端,关于void的一个疑问
    项目管理日志05-01-05
    项目管理日志05-01-04
  • 原文地址:https://www.cnblogs.com/baobaopangzi88/p/4361413.html
Copyright © 2020-2023  润新知