(CSP2019准备)DP专题

2024-03-08 23:38
文章标签 dp 准备 专题 csp2019

本文主要是介绍(CSP2019准备)DP专题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

T1

LOJ 2063. 「HAOI2016」字符合并

题意

有一个长度为 n n n 01 01 01 串,你可以每次将相邻的 k k k 个字符合并,得到一个新的字符并获得一定分数。得到的新字符和分数由这 k k k 个字符确定。你需要求出你能获得的最大分数。
1 ≤ n ≤ 300 , 0 ≤ c i ≤ 1 , w i ≥ 1 , k ≤ 8 1 \leq n \leq 300, \ 0 \leq c_i \leq 1, \ w_i \geq 1, \ k \leq 8 1n300, 0ci1, wi1, k8

题解

完全不会区间DP啊,想到最后的串小于8位,记 f [ l ] [ r ] [ s ] f[l][r][s] f[l][r][s]为把 [ l , r ] [l,r] [l,r]合并为s的最大分数,考虑过枚举合并的串,但没法转移为子区间,因为还产生新的字符,于是自闭。
所以一定又是有什么性质没想到啦!想象一下合并的过程,将过程倒一下,发现最后的s倒回去过程中,一直将一个字符展开为一个串,所以s中从左到右每个字符恰好依次对应原串中一段段互不相交的区间!于是枚举s的最后一个字符由哪段区间转移过来即可。

T2

LOJ 2078. 「JSOI2016」无界单词

题意

对于一个单词 S S S ,如果存在一个长度 l l l,满足 0 < l < ∣ S ∣ 0\lt l\lt |S| 0<l<S,并且使得 S S S 长度为 l l l 的前缀与 S S S 长度为 l l l 的后缀相同,JYY 则称 S S S 是有界的。比如 aabaaababab 就都是有界的字符串。如果一个单词不存在这样的 l l l ,则 JYY 称之为无界单词。

现在考虑所有仅由字母 ab 组成的长度为 N N N 的字符串,JYY想知道:

  1. 一共有多少个无界单词?
  2. 这些无界单词中,按字典序排列第 K K K 小的单词是哪一个?

对于 20 % 20\% 20% 的数据,满足 N ≤ 20 N\le 20 N20
对于全部数据,满足 1 ≤ T ≤ 5 , 1 ≤ N ≤ 64 1\le T\le 5,1\le N\le 64 1T5,1N64,并且保证对于任意测试数据,总存在第 K K K 小的无界单词。

题解

为什么每次涉及字符串的题都要乱想半天啊,对字符串一点感觉都没有。。。
对于第一问,考虑用总的减去有界的,记 f [ i ] f[i] f[i]为长度为i的无界单词数量,枚举最短的 l l l,对于 l ≤ n / 2 l\le n/2 ln/2显然有 f [ l ] × 2 n − 2 l f[l]\times 2^{n-2l} f[l]×2n2l种,对于 n / 2 < l n/2<l n/2<l的,想了半天最后发现显然这种情况下还会有更小的 l l l!
对于第二问,容易想到按位算,于是只需考虑在前i位确定的情况下的无界单词数量,依然枚举最小的 l l l,上界仍是 n / 2 n/2 n/2,判断一下已知的部分是否是无界的,以及在已知部分与长度为l的后缀重叠时,重叠部分必须要是已知部分的 n x nx nx指针能跳到的位置。

T3

LOJ 2093. 「ZJOI2016」线段树

题意

小 Yuuka 遇到了一个题目:有一个序列 a 1 , a 2 , … , a n a_1, a_2, \ldots , a_n a1,a2,,an,对其进行 q q q次操作,每次把一个区间内的数改成区间内的最大值,问最后每个数是多少。

小 Yuuka 很快地就使用了线段树解决了这个问题。于是充满智慧的小 Yuuka 想,如果操作是随机的,即在这 q q q 次操作中每次等概率随机地选择一个区间 [ l , r ] [l,r] [l,r] ( 1 ≤ l ≤ r ≤ n ) (1 \leq l \leq r \leq n) (1lrn),然后将这个区间内的数改成区间内最大值(注意这样的区间共有 n ( n + 1 ) 2 \frac{n(n+1)}{2} 2n(n+1) 个),最后每个数的期望大小是多少呢?小 Yuuka 非常热爱随机,所以她给出的输入序列也是随机的(随机方式见数据规模和约定)。对于每个数,输出它的期望乘 ( n ( n + 1 ) 2 ) q (\frac{n(n+1)}{2})^q (2n(n+1))q 再对 1 0 9 + 7 10^9+7 109+7 取模的值。

对于所有的测试数据,保证序列中数的大小不超过 1 0 9 10^9 109,即 a i ≤ 1 0 9 a_i≤10^9 ai109,并且每个数是 0 0 0 1 0 9 10^9 109 之间的随机整数。
n ≤ 400 , q ≤ 400 n \leq 400, \ q \leq 400 n400, q400

题解

本来有一个比较奇怪的想法:先考虑一个数对其他数的影响,即在它所能影响的区间内(即最大值为它的极大区间),每次去延伸,可记录左右端点为状态用DP计数。而题目要求的是每个数最后的期望,于是考虑一个数所受到的影响,即将该过程逆过来看,每次受影响的区间也不断扩散,也可用DP计数,但这样效率是 O ( n 4 ) O(n^{4}) O(n4)的,想了半天的优化自闭了 。(要是只求期望和就好了)
所以考虑每个数的期望,效率是有局限的,仍然考虑每个数对其它数的影响。若考虑哪些位置最后刚好变成了这个数,显然不好算。于是考虑容斥,如果考虑变成不小于这个数的话,也难以用差分计算这个数的贡献(不知道次小的是哪个);而如果是变成不大于这个数,则它的贡献是它与所能影响到的区间的两端最小值的差分,这样对于一个数,若最终变成x,则所有影响范围包含x的数都对它有影响,把最大值的贡献记为它本身,这样的贡献总和就为x,于是就可把每个数的贡献一起用一个区间DP计算了。

T4

LOJ 2136. 「ZJOI2015」地震后的幻想乡

题意

傲娇少女幽香是一个很萌很萌的妹子,而且她非常非常地有爱心,很喜欢为幻想乡的人们做一些自己力所能及的事情来帮助他们。

这不,幻想乡突然发生了地震,所有的道路都崩塌了。现在的首要任务是尽快让幻想乡的交通体系重新建立起来。幻想乡一共有 n n n 个地方,那么最快的方法当然是修复 n − 1 n-1 n1 条道路将这 n n n 个地方都连接起来。 幻想乡这 n n n 个地方本来是连通的,一共有 m m m 条边。现在这 m m m 条边由于地震的关系,全部都毁坏掉了。每条边都有一个修复它需要花费的时间,第 i i i 条边所需要的时间为 e i e_i ei。地震发生以后,由于幽香是一位人生经验丰富,见得多了的长者,她根据以前的经验,知道每次地震以后,每个 e i e_i ei 会是一个 0 0 0 1 1 1 之间均匀分布的随机实数。并且所有 e i e_i ei 都是完全独立的。

现在幽香要出发去帮忙修复道路了,她可以使用一个神奇的大魔法,能够选择需要的那 n − 1 n-1 n1 条边,同时开始修复,那么修复完成的时间就是这 n − 1 n-1 n1 条边的 e i e_i ei 的最大值。当然幽香会先使用一个更加神奇的大魔法来观察出每条边 e i e_i ei 的值,然后再选择完成时间最小的方案。 幽香在走之前,她想知道修复完成的时间的期望是多少呢?

提示:

(以下内容与题意无关,对于解题也不是必要的。)

对于 n n n [ 0 , 1 ] [0,1] [0,1] 之间的随机变量 x 1 , x 2 , . . . , x n x_1,x_2,...,x_n x1,x2,...,xn,第 k k k 小的那个的期望值是 k / ( n + 1 ) k/(n+1) k/(n+1)

数据范围:

对于所有数据: n ≤ 10 , m ≤ n ( n − 1 ) / 2 , n , m ≥ 1 n \leq 10, \ m \leq n(n-1)/2, \ n,m \geq 1 n10, mn(n1)/2, n,m1

对于 15 % 15 \% 15% 的数据: n ≤ 3 n \leq 3 n3

另有 15 % 15 \% 15% 的数据: n ≤ 10 , m = n n \leq 10, m=n n10,m=n

另有 10 % 10 \% 10% 的数据: n ≤ 10 , m = n ( n − 1 ) / 2 n \leq 10, m=n(n-1)/2 n10,m=n(n1)/2

另有 20 % 20 \% 20% 的数据: n ≤ 5 n \leq 5 n5

另有 20 % 20 \% 20% 的数据: n ≤ 8 n \leq 8 n8

题解

借助提示,题目可转化为一张图最小生成树最大边排名的期望。
形式化一下,设最小生成树最大边排名为 x x x,则前 x − 1 x-1 x1条边无法使该图联通,而前 x x x条边可以,由此想到容斥,用 x − 1 x-1 x1条边不行的概率减掉 x x x条边不行的概率即为 x x x条边恰好可以的概率,即只需计算 x x x条边无法使图连通的概率。
又注意到每条边是等价的,于是转化为 x x x条边无法使图连通的方案数,这个又是个经典的套路:连通+不连通=总(易求),而 n n n很小,可以状压: f [ i ] [ s ] f[i][s] f[i][s] i i i条边使 s s s不连通的方案数,其中 s s s一定包含1,枚举1所在的连通块,强制其与剩下的点之间没有连边且 s s s联通即可,于是转移到 g [ j ] [ t ] g[j][t] g[j][t] j j j条边使 t t t连通), g g g的转移用总的减去 f f f即可。

T5

LOJ 2139. 「ZJOI2015」幻想乡 Wi-Fi 搭建计划

题意

傲娇少女幽香是一个很萌很萌的妹子。随着科技的进步,幻想乡的大家也开始使用手机了。这时幽香发现没人来她的太阳花田玩了,她感到很伤心,于是向别人打听了一下,才知道原来大家都嫌弃这里没有 Wi-Fi,手机上网还需要流量。

怎么办呢?幽香决定赶快搭建几个 Wi-Fi 点,让所有人都能在太阳花田里畅快地上网。

我们可以近似地把太阳花田看成一个 y y y 轴在 [ 0 , R ] [0,R] [0,R] 之间, x x x 坐标在 ( − ∞ , + ∞ ) (-\infty,+\infty) (,+)(也就是在 x x x 轴上无限延伸)的无限长方形。

太阳花田里面有 n n n 个景点,是游客们经常光顾的,幽香认为只要让这些景点尽量被 Wi-Fi 覆盖,那么游客们就肯定心满意足了。

八云紫表示她可以帮幽香架设 Wi-Fi 路由器。现在通用的路由器,每个的覆盖半径正好也是 R R R。八云紫扫视了一遍地图,发现在太阳花田外面,只有 m m m 个有网络的地点,她只可以在那里架设路由器。如果你在点 p p p 搭建了路由器,那么位于 q q q 的地点,只要 p p p q q q 的欧几里得距离小于等于 R R R q q q 点就会被 Wi-Fi 覆盖。

同时八云紫表示,架设难度随着地点的不同而不同,所以收费也不一样,在第 i i i 个位置架设需要 c i c_i ci 的钱。

现在幽香想要覆盖尽量多的景点,在这个前提下,幽香也想要尽量节省钱。你能帮助她吗?
对于 10 % 10\% 10% 的数据, n , m ≤ 20 n,m\le 20 n,m20

对于另 30 % 30\% 30% 的数据, n , m ≤ 100 n,m\le 100 n,m100,所有网络架设点的 y y y 坐标都大于 R R R

对于另 60 % 60\% 60% 的数据, n , m ≤ 100 n,m\le 100 n,m100

对于全部数据, 1 ≤ R ≤ 1 0 8 , 0 ≤ c ≤ 1 0 4 1\le R\le 10^8,0\le c\le 10^4 1R108,0c104

题解

直接依题意是用最小的权值覆盖所有点,但这不是个多项式复杂可解问题,故考虑有什么性质。
先考虑Wi-Fi只有一边的情况,通过画图发现按x轴排序后,最优方案下每个选中的Wi-Fi覆盖到的是一段连续区间,因为r是相同的,一个Wi-Fi覆盖到的一定是x坐标越靠近越有优势,故不会存在两个点被一个Wi-Fi覆盖时,它们中间的点只能被另一个Wi-Fi覆盖,于是转化为一个经典的DP问题。

这篇关于(CSP2019准备)DP专题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/788801

相关文章

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include

usaco 1.1 Broken Necklace(DP)

直接上代码 接触的第一道dp ps.大概的思路就是 先从左往右用一个数组在每个点记下蓝或黑的个数 再从右到左算一遍 最后取出最大的即可 核心语句在于: 如果 str[i] = 'r'  ,   rl[i]=rl[i-1]+1, bl[i]=0 如果 str[i] = 'b' ,  bl[i]=bl[i-1]+1, rl[i]=0 如果 str[i] = 'w',  bl[i]=b

uva 10154 DP 叠乌龟

题意: 给你几只乌龟,每只乌龟有自身的重量和力量。 每只乌龟的力量可以承受自身体重和在其上的几只乌龟的体重和内。 问最多能叠放几只乌龟。 解析: 先将乌龟按力量从小到大排列。 然后dp的时候从前往后叠,状态转移方程: dp[i][j] = dp[i - 1][j];if (dp[i - 1][j - 1] != inf && dp[i - 1][j - 1] <= t[i]

uva 10118 dP

题意: 给4列篮子,每次从某一列开始无放回拿蜡烛放入篮子里,并且篮子最多只能放5支蜡烛,数字代表蜡烛的颜色。 当拿出当前颜色的蜡烛在篮子里存在时,猪脚可以把蜡烛带回家。 问最多拿多少只蜡烛。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cs

uva 10069 DP + 大数加法

代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vector>#include <queue>#include <map>#include <cl

uva 10029 HASH + DP

题意: 给一个字典,里面有好多单词。单词可以由增加、删除、变换,变成另一个单词,问能变换的最长单词长度。 解析: HASH+dp 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#inc

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o