zoukankan      html  css  js  c++  java
  • 集训Day 9 2020.3.9 动态规划(四)

    集训Day 9 2020.3.9

    动态规划(四)

    1.HDU-2196

    给一棵树,有n个结点,结点之间的边有权值,问每个结点的最远结点距离其多远 介绍一个定义:树的直径指的是树上两个最远点对。

    题解

    求法1:任取点u,找到离他最远的点v,然 后再找离v最远的点w,则((v,w))为直径。
    求法2:维护dp[u][0/1]为u子树内以u为端点 的最长路/次长路,答案就是 dp[u][0]+dp[u][1];

    我们还有一个定理,对于树上任意一个点 它的最远点对必定为直径两个点之间的一个。 故复杂度三次dfs
    对于求法1和之后的用处的证明可以课后自行查看: https://blog.csdn.net/u011426016/article/details/89164896

    2.P1077 摆花

    小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共(m)盆。通过调查顾客的喜好,小明列出了顾客最喜欢的(n)种花,从(1)(n)标号。为了在门口展出更多种花,规定第(i)种花不能超过(a_i)盆,摆花时同一种花放在一起,且不同种类的花需按标号的从小到大的顺序依次摆列。
    试计算,一共有多少种不同的摆花方案。

    题解

    这题实际上是最简单的
    f[i][j]表示我取了前(i)种花,拿了(j)盆花的方案,则

    f[i][j]+=f[i-1][j-k](0<=k<=ai)
    

    记得取模

    3.U53204 选课加强版

    (原P2014 选课)
    https://www.luogu.com.cn/problem/U53204

    现在有 (N) 门功课,每门课有个学分,每门课有一门或没有直接先修课(若课程a是课 程b的先修课即只有学完了课程( ext A),才能学习课程( ext B))。一个学生要从这些课程里选择( ext M)门课程学习,问他能获得的最大学分是 多少?

    题解

    树形背包O(nm)的做法
    题解来自洛谷
    https://www.luogu.com.cn/blog/P6174/solu tion-p2014

    4. P1091 合唱队形

    【题面待补充】

    题解

    求一次最长上升子序列和一次最长下降子 序列即可。

    5.POJ1651

    乘法游戏是在一行牌上进行的。每一张牌包括了一个正整数。在每一个移动中,玩 家拿出一张牌,得分是用它的数字乘以它 左边和右边的数,所以不允许拿第1张和最 后1张牌。最后一次移动后,这里只剩下两 张牌。你的目标是使得分的和最小。(nle 200)

    题解

    dp[i][j]表示i~j区间做乘法游戏得到的最 值。显然长度为3的时候别无选择只能拿中间的。
    那剩下的情况可以为:枚举最后拿的数,递归左右边,最后显然乘起来的就是左右 边界和最后的这一个数。

    6.HDU5115

    (n)匹狼,每一次攻击可以秒杀一匹狼,但同时会受到这匹狼的( ext A)攻击和它相邻两只狼 的( ext A)
    给定(A,B),求受伤最小的方案。(nle 200)

    题解

    dp[i][j]表示在整个大问题内将i~j的狼消灭完需要受多少伤害。
    那么显然我们枚举最后一个被消灭的狼, 递归左右,则最后一匹狼的攻击为左边界 之左,右边界之右的b和它本身的a。
    本质其实就是刚才的题的变化版

    7.P1879

    一块长方形的新牧场被划分成(M)(N)((1 ≤ M ≤ 12,1 ≤ N ≤ 12)),每一格都是一块正方 形的土地。( ext{John})打算在牧场上的某几格里 种上美味的草,供他的奶牛们享用 遗憾的是,有些土地相当贫瘠,不能用来 种草。并且,奶牛们喜欢独占一块草地的 感觉,于是( ext{John})不会选择两块相邻的土地, 也就是说,没有哪两块草地有公共边。
    给你土地的贫瘠与否,一共有多少种种植 方案可供他选择?(当然,把新牧场完全 荒废也是一种方案)

    题解

    互不侵犯翻版?限制还是有点大的。
    设f[i][j]表示处理到i行,i行的状态为j的方案个数。显然

    f[i][j]+=f[i-1][k]|j,k合法且互不冲突
    

    那么现在关键问题是多了一个土地限制怎么做?
    对土地情况取反然后与状态&,为0就成立

    8.P4170 [CQOI2007]涂色

    每次你可以把一段连续的木版涂成一个给 定的颜色,后涂的颜色覆盖先涂的颜色。 用尽量少的涂色次数达到目标。

    题解

    猜测是区间dp之后就不难列状态f[i][j]为 把i~j涂成目标所花的涂色次数。
    i==j则

    f[i][j]=1
    

    a[i]==a[j]则我刚开始涂的时候i和j完全可以 一起涂,即

    f[i][j]=min(f[i][j-1],f[i+1][j]) 
    

    否则底色肯定是要分开来涂的,即

    f[i][j]=min(f[i][k]+f[k+1][j],f[i][j]);
    

    课后练习

    1.P1837 单人纸牌

    2.P1140 相似基因

    3.JSK43368

    https://nanti.jisuanke.com/t/43368

    (n(nle 20))个坐标,每个坐标有只宝可梦,你 在((0,0)),问你最少走多远可以集齐全部类 型的宝可梦(你走路只能按照曼哈顿距离 走)

    2196@HDU,P1077,U53204,P1091,1651@POJ,5115@HDU,P1879,P4170,P1837,P1140

    要做就做南波万
  • 相关阅读:
    《网络是怎样连接的》读书笔记一
    移植mplayer到开发板
    解决ubuntu安装ssh服务无法打开解析包问题
    嵌入式软件工程师面经
    c语言-数组、指针面试题
    Linux命令- echo、grep 、重定向、1>&2、2>&1的介绍
    回调函数的作用
    数据结构-单链表回环函数判断
    算法-一步步教你如何用c语言实现堆排序(非递归)
    算法-快速排序
  • 原文地址:https://www.cnblogs.com/liuziwen0224/p/xjx9.html
Copyright © 2011-2022 走看看