dp优化 12 - 09

数据结构优化

单调队列优化

  • dp[i]=min(f[j])+g[i]
  • 其中 l[i]jr[i]lr 单调不减 。

双端队列队列,队列内保存之后可能成为最优值的值,保证有单调性。
特点是转移范围有限制。

真·数据结构优化

l,r 没有单调性时,就可以用线段树之类的数据结构快速查询决策点。
比单调队列更好像,但复杂度要多一个 log

hdu 3401 Trade

Description

知道之后 n 天的股票买卖价格( apibpi ),以及每天股票买卖数量上限( asibsi ),问他最多能赚多少钱。开始时有无限本金,要求任两次交易需要间隔 W 天以上,即第 i 天交易,第 i+w+1 天才能再交易。同时他任意时刻最多只能拥有 maxp 的股票。

Solution
  • dp[i][j] 表示第 i 天, 有 j 股最大收益。

显然转移有三种情况,买,卖,不做事

  • dp[i1][j]
  • max(dp[iw1][k]api×(jk)) ,其中 j>k
  • max(dp[iw1][k]+bpi×(kj)) ,其中 k>j

把式子化简后可以得到单调队列优化的基本形式。

hdu 2490 Parade

Description

F 城有 n+1 个横向路和 m+1 个竖向路组成,你的任务是从最南边的路走到最北边的路,使得走过的路上的高兴值最大(高兴值可能是负值)。同一段路不能经过两次,且不能从北往南走,另外每条横向的路所花的时间不能超过 K ,输出最大的高兴值。

Solution

  • dp[i][j]ij 列的最大值。
    • dp[i][j]=max(dp[i1][k]+|sum[j]sum[k]|) ,其中 |jk|K

    显然满足单调队列优化的条件。

    白学现场

    Description

    雪菜为了能让冬马参加轻音乐同好会,瞒着春希,和冬马见面。为了增进感情,雪菜拉着还没缓过神来的冬马进了游戏厅……游戏要求两名玩家在排成一排的 n 个石头上跳跃前进,每个石头有一个高度,玩家只能向右跳,并且不能跳向比自己所在位置的石头矮的石头。一个石头在一个玩家跳离后就会消失,并且两个玩家不能同时站在同一个石头上。游戏分数为两个玩家站过的石头的总数。游戏起始,两名玩家都可以任选一个石头作为开始位置(当然不能相同)。由于冬马是挂科专家,雪菜又只有英语好,所以她们两人想请你帮助他们,怎么才能让分数最高。

    Solution

    • d[i][j] 表示一个人在 i 结尾,另一个人在 j 结尾的最大收益。

      暴力转移

      • max(dp[u][j])+1 ,其中 a[u]a[i]
      • max(dp[i][v])+1 , 其中 a[v]a[j]

      没有单调性,挂个线段树。

      最大值和

      Description

      将一个由 N 个非负数组 a[i] 成的序列划分成若干段,要求每段数字的和不超过 M ,求【每段的最大值】的和 的最小的划分方法,输出这个最小的和。

      Solution

      • dp[i]=min(dp[j]+max[j+1][i])

        对于一个最大值 a[x] ,上一个最大值是 a[y] ,当 j[y,x) 时,max[j+1][i] 是不会改变的。
        所以维护一个递减的队列,存的是符合要求的某一段的最大值。但是需要注意,队首元素不一定是最优的,由于队列的递减性质,队列中的所有元素都有可能组成最优解。需要加上线段树。


        斜率优化

        真正的口胡利器。

        一般来说转移方程含平方。

        打印

        Description

        F 要打印一篇文章,打印每个单词都有一个费用 ci ,将第 i 个单词到第 j 个单词打印到一行的代价是为 sum(ck)2+m(ikj)。问如何排版使得总代价最少。

        Solution
        • dp[i]=min(dp[j]+(sum[i]sum[j])2+m)

        展开。

        • dp[i]=sum[i]2+m+min(dp[j]+sum[j]22×sum[i]×sum[j])

        • x=sum[j]
        • y=dp[j]+sum[j]2
        • a=sum[i]
        • b=dp[i]

        那么

        • b=min(2ax+y)

        问题变成了求直线 y=2ax+b 的最小截距。
        (x,y) 坐标系里面,那么决策点一定在下凸壳上。

        但是我个人不喜欢截距这种斜率优化方法。

        hdu 2993

        Description

        给一个长度为 n 正整数的序列,找出长度 k 的平均值最大的连续子序列。

        Solution

        已写,略去。

        bzoj 1010 玩具装箱

        Description

        n 个玩具需要装箱,每个玩具的长度为 c[i] ,规定在装箱的时候,必须严格按 照给出的顺序进行,并且同一个箱子中任意两个玩具之间必须且只能间隔一个单位长度,换 句话说,如果要在一个箱子中装编号为 i j 的玩具,则箱子的长度必须且只能是 ,规定每一个长度为 l 的箱子的费用是 ,其中 L 是给定的 一个常数。现在要求你使用最少的代价将所有玩具装箱,箱子的个数无关紧要。

        Solution

        已写,略去。


        四边形不等式优化

        我曾经听uestc某选手说这个学了没用

        这玩意儿可以拿来处理这类方程

        • f(i,j)=min(f(i,k1)+f(k,j))+W(i,j)

          考虑 W ,若对于任意 iijj ,有

          • W(i,j)+W(i,j)W(i,j)+W(i,j)

          W 满足四边形不等式。
          f(i,j) 最优时决策点为 s(i,j),那么

          • s(i,j)s(i,j+1)s(i+1,j+1)

          于是

          • f(i,j)=minf(i,k1),f(k,j)+W(i,j)
          • 其中 (s(i,j1)ks(i+1,j))

          油锯

          Description

          用数轴描述一条高速公路,有 V 个村庄,每一个村庄坐落在数轴的某个点上,需要选择 P 个村庄在其中建立邮局,要求每个村庄到最近邮局的距离和最小。

          Solution
          • dp[i][j] 表示建好 i 个邮局时覆盖到第 j 个村庄的最优解
          • dp[i][j]=min(dp[i1][k]+w[k+1][j])

          打表得 w 满足四边形不等式。
          打表大fa♂好,退竞保平安。


          矩阵快速幂优化

          可以处理求斐波那契额数列的第 n 项之类的问题。这类问题的规模一般十分巨大,巨大到不像是 dp 的规模,且转移方程单一,不涉及最大/小问题,像个递推式。求出转移矩阵,矩阵快速幂即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值