
动态规划
文章平均质量分 78
Frozen_Guardian
已退役菜鸡Acmer
展开
-
(转)ST表算法
插眼:点击查看用法:O(nlogn)时间打表,O(1)时间查询区间最值模板:const int N=1e5+100;int a[N];int st[N][30];void ST_build(){ for(int i=1;i<=n;i++) st[i][0]=a[i]; for(int i=1;i<=log2(n);i++) for(int j=1...转载 2019-11-04 10:45:24 · 284 阅读 · 0 评论 -
2022山东省赛 B - Minimum Expression(dp)
题目链接:点击查看题目大意:给出一个长度为 nnn 的仅由数字 1−91-91−9 组成的字符串,问恰好添加 mmm 个加号后,等式的最小值是多少题目分析:不需要考虑前导 000,而且仅有加号,不难想到很经典的 dp[i][j]dp[i][j]dp[i][j],代表前 iii 个位置,划分了 jjj 段后的最小答案,转移方程也是经典的 dp[i][j]=min0≤k<i(dp[k][j−1])dp[i][j]=min_{0\le k < i}(dp[k][j-1])dp[i][j]=min0原创 2022-05-24 21:47:50 · 1055 阅读 · 10 评论 -
CodeForces - 1579G Minimal Coverage(dp)
题目链接:点击查看题目大意:给出 nnn 个长度不同的木棍。设第 i−1i-1i−1 次放置木棍后的终点为 xxx,那么第 iii 个木棍有且仅有两种放置方法:放到 [x+1,x+a[i]][x+1,x+a[i]][x+1,x+a[i]],终点变为 x+a[i]x+a[i]x+a[i]放到 [x−a[i],x−1][x-a[i],x-1][x−a[i],x−1],终点变为 x−a[i]x-a[i]x−a[i]问如何放置可以使得被覆盖的端点数最少题目分析:读懂题后不难想到 2n2^n2n 去暴力原创 2021-11-08 18:32:27 · 401 阅读 · 0 评论 -
2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 分组(矩阵快速幂套NTT优化dp)
题目链接:点击查看题目大意:给出 nnn 个连续的小球,每次可以选择单独的一个或者相邻的两个小球分成一组,允许有剩余的小球,问恰好分成 k∈{1,2,3,⋯ ,m}k\in\{1,2,3,\cdots,m\}k∈{1,2,3,⋯,m} 组的方案数分别是多少。题目分析:设 dp[i][j]dp[i][j]dp[i][j] 为前 iii 个小球分成 jjj 组的方案数,不难推出:dp[i][j]=dp[i−1][j]+dp[i−1][j−1]+dp[i−2][j−1]dp[i][j]=dp[i-1][j.原创 2021-10-25 10:41:32 · 822 阅读 · 2 评论 -
CodeForces - 1562E Rescue Niwen!(dp)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串 sss,将其子串按顺序展开成序列,即 {s1,s1s2,⋯ ,s1s2…sn,s2,s2s3,s2s3…sn,s3,s3s4,⋯ ,sn−1sn,sn}\{s_1,s_1s_2,\cdots ,s_1 s_2 \ldots s_n,s_2,s_2 s_3, s_2 s_3\ldots s_n,s_3,s_3 s_4,\cdots,s_{n-1}s_n,s_n\}{s1,s1s2,⋯,s1s2…sn,s2,s2s3,s2s3原创 2021-08-27 17:02:24 · 349 阅读 · 0 评论 -
2021HDU多校8 - 7057 Buying Snacks(矩阵快速幂套NTT优化dp)
题目链接:点击查看题目大意:给出 nnn 种糖果,每种糖果有大小包装之分,有三种购买方案,价钱分别如下:单独购买一个小的,花费一块钱单独购买一个大的,花费两块钱∀i>1\forall i>1∀i>1,可以和 i−1i-1i−1 的糖果捆绑购买,可以便宜一块钱问给出的钱在范围 [0,m][0,m][0,m] 内的不同购买方案数分别是多少题目分析:读完题不难想到最简单的 n2n^2n2 dp,dp[i][j]dp[i][j]dp[i][j] 代表前 iii 个糖果花费了 jj原创 2021-08-14 10:29:24 · 441 阅读 · 0 评论 -
CodeForces - 1557D Ezzat and Grid(线段树+dp)
题目链接:点击查看题目大意:给出 nnn 个 010101 串,现在问最少需要删掉多少个串,才能使得剩下的串拼起来是连通的规定两个 010101 串是连通的,当且仅当存在至少一列,在两个串中都为 111题目分析:正难则反,题目要求删除最少,那么我们思考如何使得保留下来的串最多。考虑 dp[i]dp[i]dp[i] 为以第 iii 个序列为结尾的,可以保留的最多的串的个数,模仿最长不下降子序列的思路,dp[i]=dp[j]+1dp[i]=dp[j]+1dp[i]=dp[j]+1,当且仅当串 iii 和串原创 2021-08-11 16:08:58 · 265 阅读 · 0 评论 -
2021HDU多校7 - 7054 Yiwen with Formula(分治MTT优化dp)
题目链接:点击查看题目大意:给出一个长度为 nnn 的数列 aaa,现在需要求∏b1<b2<⋯<bk(ab1+ab2+⋯+abk)\prod_{b_1<b_2<\cdots<b_k} (a_{b_1}+a_{b_2}+\cdots+a_{b_k})b1<b2<⋯<bk∏(ab1+ab2+⋯+abk)需要满足:1≤bi≤n1 \leq b_i \leq n1≤bi≤nb1<b2<⋯<bkb_1<b_2原创 2021-08-10 23:41:35 · 359 阅读 · 0 评论 -
2021牛客多校5 - Double Strings(dp+组合数学)
题目链接:点击查看题目大意:给出两个字符串 sss 和 ttt,要求 “一段相同的前缀” + “一个不同的字符(满足s[i]<t[j])”+ “长度相同的任意后缀” 的组成方案数,其中可以选取 sss 和 ttt 的子序列用于构成题目分析:类比于最长公共子序列,这里将 dp[i][j]dp[i][j]dp[i][j] 定义为,由字符串 s[1:i]s[1:i]s[1:i] 和 t[1:j]t[1:j]t[1:j] 组成的相同前缀的个数,其实也就是方案数,转移的话 dp[i][j]=dp[i−1][原创 2021-07-31 20:17:45 · 245 阅读 · 0 评论 -
CodeForces - 1551F Equidistant Vertices(暴力+dp)
题目链接:点击查看题目大意:给出一棵 nnn 个节点组成的树,问选出 kkk 个节点满足相互之间距离相等的方案数有多少题目分析:n=100n=100n=100,感觉数据范围越小的题目越难发现 tag。补完这个题目后发现每个知识点自己都已经掌握了,但是组合起来就分析不出来,分析题目的能力还是有所欠缺回到本题,首先特判 k==2k==2k==2 的情况,样例也给出了提示。需要思考出的一个思维点就是,kkk 个节点相互之间的距离相等,等价于存在一个中间点 xxx,满足任意两个节点 dis(ai,x)=di原创 2021-07-25 10:55:40 · 459 阅读 · 0 评论 -
CodeForces - 1551E Fixed Points(dp)
题目链接:点击查看题目大意:给出一个长度为 nnn 的序列,需要求出删掉最少的数字,使得剩下的数字至少有 kkk 个位置满足 a[i]=ia[i]=ia[i]=i 成立题目分析:看完数据范围不难想到 n2n^2n2 的 dp,然后转移的话就是枚举每个位置是否删除,一开始是想 dp[i][j]dp[i][j]dp[i][j] 表示到了第 iii 个位置,已经有 jjj 个数满足条件的最小操作数,答案自然就是 dp[n][k]dp[n][k]dp[n][k] 了,但是不好转移,于是换种状态:dp[i][j]原创 2021-07-24 10:59:27 · 273 阅读 · 0 评论 -
CodeForces - 1481E Sorting Books(贪心+dp)
题目链接:点击查看题目大意:给出一个长度为 nnn 的序列,每次操作可以将任意一本书放到序列的末尾,问最少需要操作多少次,才能使得相同的数字挨在一起题目分析:不难看出,对每个位置的数都操作一次,是肯定能满足条件的,现在我们的目标是如何求得最优解我们需要先转换一下模型,题目要求操作最少,我们可以转换为求哪些位置是不需要移动的。这样将剩下的位置按照一定次序进行操作,一定是可以达到目标的对于某个数字 xxx 而言,设 l[x]l[x]l[x] 和 r[x]r[x]r[x] 分别为 xxx 在原序列中第一次原创 2021-07-14 15:26:00 · 228 阅读 · 0 评论 -
CodeForces - 1480D2 Painting the Array II(dp)
题目链接:点击查看题目大意:给出一个长度为 nnn 的序列,现在要求拆分成两个子序列,使得两个子序列的贡献之和最 小。对于一个序列的贡献就是,去掉相邻且相同的字母后的长度,即 ∑i=1n[a[i]!=a[i−1]]\sum_{i=1}^{n}[a[i]!=a[i-1]]∑i=1n[a[i]!=a[i−1]],其中 a[0]=0a[0]=0a[0]=0。题目分析:本题有贪心解法,参考 CodeForces - 1480D1,只需要将规则三的 last[v1]last[v1]last[v1] 和 last原创 2021-07-14 09:18:07 · 216 阅读 · 0 评论 -
CodeForces - 1547F Array Stabilization (GCD version)(ST表+二分)
题目链接:点击查看题目大意:给出一个长度为 nnn 的数组 aaa,下标从 000 开始,每次操作分为两个步骤:构建出数组 bbb,有 bi=gcd(ai,a(i+1)mod n)b_i=gcd(a_i,a_{(i+1)\mod n})bi=gcd(ai,a(i+1)modn)用数组 bbb 覆盖数组 aaa问至少需要操作多少次,才能使得数组 aaa 的每个元素都相等题目分析:方便起见,下文中的下标 (i+1)mod n(i+1)\mod n(i+1)modn 统一用 i+1i+1原创 2021-07-12 18:46:27 · 335 阅读 · 0 评论 -
CodeForces - 1485F Copy or Prefix Sum(dp)
题目链接:点击查看题目大意:给出数组 bbb,问可以构造出多少种满足条件的数组 aaa,规定数组 aaa 和数组 bbb 的关系如下:bi=aib_i = a_ibi=ai orbi=∑j=1iajb_i = \sum_{j=1}^{i} a_jbi=∑j=1iaj题目分析:乍一看是个计数问题,因为对于每个位置,aia_iai 都有两种选择,所以答案将会是 2n2^n2n 级别的,但是有些时候会重复计数,观察当 (∑j=1i−1aj)=0(\sum_{j=1}^{i-1} a_j)=原创 2021-06-14 13:56:16 · 208 阅读 · 0 评论 -
CodeForces - 1486D Max Median(二分+最长连续子段和)
题目链接:点击查看题目大意:给出一个长度为 nnn 的数列,现在从长度至少为 kkk 的连续子段中,找到最大的中位数题目分析:做过平均数的模型:POJ - 2018 Best Cow Fences将平均数换成中位数该如何去考虑呢,现在问题转换为了,枚举 xxx 作为中位数,该如何 checkcheckcheck 序列是否合法考虑若一个数想要成为中位数,则至少有一半及以上的数比他小才行,那么我们如果将比 xxx 小的数视为 −1-1−1 ,大于等于 xxx 的数视为 111 会怎么样呢?不难发现,如果原创 2021-06-09 16:46:15 · 329 阅读 · 0 评论 -
牛客 - Connie(AC自动机+dp/KMP+dp)
题目链接:点击查看题目大意:给出一个匹配串 sss,现在问模式串 ttt 的期望得分。其中假设匹配串在模式串中的出现次数为 xxx,那么将得到 2x2^x2x 的分数题目分析:涉及到了期望一开始还以为是概率,后来发现其实就是个计数问题题目实际让我们操作的就是,枚举 5n5^n5n 种字符串,然后对于每种字符串统计匹配串 sss 的出现次数,注意这里的出现次数并不能说是最多或最少的出现次数,先将贡献的式子转换一下:2x=(...((1)∗2)∗2)∗2...)∗22^x=(...((1)*2)*2)*原创 2021-06-03 09:02:17 · 306 阅读 · 0 评论 -
兰州大学第一届『飞马杯』程序设计竞赛 - ★★飞马祝福语★★(动态dp)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串 sss ,现在有 mmm 次操作,每次操作可以修改 [l,r][l,r][l,r] 内的字符为 chchch,问每次修改之后的字符串内含有多少个 “FeiMa” 的子序列题目分析:这种题应该叫动态 dpdpdp 吧,线段树的每个节点维护一个 dpdpdp,dpl,rdp_{l,r}dpl,r 代表含有子序列 [l,r][l,r][l,r] 的数量,合并的话就是:dpk,l,r=dpk<<1,l,r+dpk<<1∣1原创 2021-05-29 20:20:52 · 249 阅读 · 3 评论 -
CodeForces - 1497E2 Square-free division (hard version)(dp+数论)
题目链接:点击查看题目大意:给出一个长度为 nnn 的数列,现在最多可以修改 kkk 个数字为任意数值,现在问最少可以将数列划分成多少个连续的数列,使得每一个单独的段中,任意两个数的乘积都不能是完全平方数,完全平方数是指诸如 1,4,9,16{1,4,9,16}1,4,9,16 等题目分析:先简单说一下 E1E1E1,E1E1E1 就是 k=0k=0k=0 的情况,正因为少了修改,所以直接贪心即可,依据就是,当遍历到 xxx 时,若 xxx 可以和前面一段的数字中的任意一个组成完全平方数,则让 xxx原创 2021-05-26 19:07:57 · 262 阅读 · 4 评论 -
CodeForces - 1497D Genius(dp)
题目链接:点击查看题目大意:给出 nnn 个问题,每个问题有如下属性:tagtagtag:标签ccc:困难度sss:奖励值初始时 ci=2ic_i=2^ici=2i,初始时 IQ=0IQ=0IQ=0 ,假设 lastlastlast 是最后一个回答的问题,则需要满足 ∣ci−clast∣>IQ|c_i-c_{last}|>IQ∣ci−clast∣>IQ 才可以回答问题 iii,且回答之后会发生的变化:IQ=∣ci−clast∣IQ=|c_i-c_{last}|IQ=原创 2021-05-26 09:59:59 · 233 阅读 · 0 评论 -
CodeForces - 1484E Skyline Photo(dp+单调栈)
题目链接:点击查看题目大意:给出 nnn 个建筑,每个建筑有一个高度和一个美丽值,现在要求划分为数个连续的区间,使得所有区间的贡献之和最大,其中每个区间的贡献值为,区间中高度最低的建筑物的美丽值题目分析:不难分析出一个很简单的经典区间划分 dpdpdp,时间复杂度是 O(n2)O(n^2)O(n2) 的:dpi=max(dpj+val(j+1,i))dp_i=max(dp_j+val(j+1,i))dpi=max(dpj+val(j+1,i)),其中 j∈[0,i−1]j\in[0,i-1]j∈[原创 2021-05-24 16:06:15 · 318 阅读 · 0 评论 -
CodeForces - 1498D Bananas in a Microwave(思维+dp)
题目链接:点击查看题目大意:给出 nnn 次操作,初始时有一个 k=0k=0k=0,每次操作抽象为三个数 t x yt\ x\ yt x y,其中 xxx 可能为小数,可以选择一个 num∈[0,y]num\in[0,y]num∈[0,y],使得:t=1t=1t=1:执行 numnumnum 次 k=⌈(k+x)⌉k=\lceil (k+x) \rceilk=⌈(k+x)⌉t=2t=2t=2:执行 numnumnum 次 k=⌈(k∗x)⌉k=\lceil (原创 2021-05-22 21:08:37 · 225 阅读 · 0 评论 -
CodeForces - 1527E Partition Game(dp+线段树)
题目链接:点击查看题目大意:给出一个长度为 nnn 的数列,现在需要将其划分成 kkk 段,使得贡献和最小对于每段区间 [l,r][l,r][l,r] 的贡献为,其中每个数字,其最后一次出现的位置减去其首次出现的位置输出最小贡献题目分析:区间划分,经典的 dpdpdp 问题,dpi,jdp_{i,j}dpi,j 代表前 iii 个数划分为 jjj 个区间的最优解,两种转移方程:dpi,j=min(dpi−1,j+(ai属于上一段的贡献),dpi−1,j−1+(ai独成一段的贡献))dp_{i,原创 2021-05-21 16:17:38 · 628 阅读 · 0 评论 -
CodeForces - 1509C The Sports Festival(dp)
题目链接:点击查看题目大意:给出一个长度为 nnn 的数列,现在需要对其进行重排列,使得贡献之和最小对于一个排列的贡献来说,对于每个 iii ,则 di=max(a1,a2,...,ai)−min(a1,a2,...,ai)d_i=max(a_1,a_2,...,a_i)-min(a_1,a_2,...,a_i)di=max(a1,a2,...,ai)−min(a1,a2,...,ai)题目分析:贪了一晚上,然后被很良心的 test3 一直卡掉,第二天看了看题解发现就是个很经典的dp问题原创 2021-05-20 09:28:15 · 242 阅读 · 0 评论 -
CodeForces - 1525D Armchairs(dp)
题目链接:点击查看题目大意:给出一个长度为 nnn 的 010101 数列,现在可以执行的操作是:花费代价 abs(i−j)abs(i-j)abs(i−j),使得 aia_iai 和 aja_jaj 交换,问最少需要花费多少代价,可以使得原本为 111 的位置全部变为 000,题目保证一定有解题目分析:因为保证了一定有解,一开始以为就是个裸的费用流,交了一发果不其然 T 掉了,所以考虑 dp考虑一个贪心的性质,假设初始时 111 所在的位置排序后分别为 x1,x2,...,xkx_1,x_2,..原创 2021-05-19 19:50:32 · 320 阅读 · 1 评论 -
CodeForces - 1517D Explorer Space(dp)
题目链接:点击查看题目大意:给出一个 n∗mn*mn∗m 的矩阵,每个点都可以到达相邻的四个点,每条边都有一个边权,问对于每个点 (i,j)(i,j)(i,j),走 kkk 步可以回到 (i,j)(i,j)(i,j) 的最短路径题目分析:首先不难看出 kkk 如果是奇数的话无解,然后可以将题目转换为:从 (i,j)(i,j)(i,j) 走 k2\frac{k}{2}2k 步可以到达的最短路径,不难看出用后 k2\frac{k}{2}2k 步沿着前面的路径原路返回这样一定是最优的第一反应是暴力每个点原创 2021-05-11 20:04:14 · 568 阅读 · 3 评论 -
CodeForces - 560E Gerald and Giant Chess(组合数学+dp)
题目链接:点击查看题目大意:给出一个 n∗mn*mn∗m 的矩阵,其中有 kkk 个坏点,每次只能向右走或向下走,问从点 (1,1)(1,1)(1,1) 到点 (n,m)(n,m)(n,m) 共有多少种不同的路线题目分析:刷知乎看到的一道题,心血来潮就想写题了数据范围 n,mn,mn,m 都是 1e51e51e5 级别的,而 kkk 却只有 200020002000,所以从坏点入手,考虑 dpdpdp 和组合数学首先对于两个点 (x1,y1)(x1,y1)(x1,y1) 和 (x2,y2)(x2,y原创 2021-04-16 18:47:22 · 941 阅读 · 8 评论 -
CodeForces - 236D Let‘s Play Osu!(概率dp)
题目链接:点击查看题目大意:给出一个长度为 nnn 的字符串,第 iii 个位置有 pip_ipi 的概率为 OOO,有 1−pi1-p_i1−pi 的概率为 XXX,本题的贡献指的是,连续 OOO 的个数的平方,问贡献的期望是多少题目分析:如果按照正常思路不难想到一个 n2n^2n2 的 dpdpdp,大概就是 dpi,jdp_{i,j}dpi,j 表示到了第 iii 个位置结束,选还是不选第 iii 个位置的期望,转移的话一层枚举位置,另一层枚举最后一个 OOO 的长度即可,不过很可惜这个题没原创 2020-12-25 22:30:02 · 242 阅读 · 0 评论 -
CodeForces - 1459D Glass Half Spilled(dp)
题目链接:点击查看题目大意:给出 n 个水杯,每个水杯最大容量为 aia_iai,每个水杯初始时有 bib_ibi 的水,两个水杯之间可以互相倒水,不过每次会损失一半水量,更具体的说,假设第 iii 个水杯向第 jjj 个水杯中倒 xxx 单位的水(xxx可以为任意实数),那么操作之后两个杯子中的水会变为:bi−x,bj+x2b_i-x,b_j+\frac{x}{2}bi−x,bj+2x,现在可以执行任意次数的倒水操作。假设最终需要选则 kkk 个杯子,使得其水量之和尽量大,问最大可以是多少原创 2020-12-19 22:00:30 · 2089 阅读 · 8 评论 -
CodeForces - 628D Magic Numbers(数位dp)
题目链接:点击查看题目大意:首先规定一个不含前导零的数字如果满足:从最高位开始,偶数位置全为 ddd从最高位开始,奇数位置不能出现 ddd则称该数字为 d−magicd-magicd−magic 数字。现在给出一个区间 [l,r][ l , r ][l,r] ,问区间内有多少个可以整除 mmm 的 d−magicd-magicd−magic 数字,lll 和 rrr 同阶且 l,r∈[1,102000]l,r \in [ 1 , 10^{2000} ]l,r∈[1,102000]题目分析:数位原创 2020-12-19 17:06:46 · 404 阅读 · 1 评论 -
CodeForces - 577B Modulo Sum(dp+bitset优化)
题目链接:点击查看题目大意:给出一个长度为 n 的数列,现在问能否选出一个子序列,满足其累加之和可以整除 m题目分析:可以当做背包去思考,dpi,jdp_{i,j}dpi,j代表的是选了前 i 个数后是否可以组合出累加之和对 m 取余等于 j 的数,那么答案显然就是看一下 dpn,mdp_{n,m}dpn,m 是否为 1 即可不过时空复杂度都是 n * m 级别的,因为是 01 背包,所以可以将空间复杂度优化掉一维,到此为止分支出了两种做法:因为 dp 数组只有 0 或 1 两种状态,所以不难想原创 2020-12-18 16:05:42 · 1295 阅读 · 2 评论 -
CodeForces - 1102F Elongated Matrix(哈密顿路径+状压dp)
题目链接:点击查看题目大意:给出一个 n∗mn * mn∗m 的数字矩阵,现在可以对 行 进行重新排列,现在对排列后的矩阵按列展开成线性:s1,s2,…,snm=maze1,1,maze2,1,...mazen,1,maze2,1,...,mazen,ms_1, s_2, \dots, s_{nm}=maze_{1,1},maze_{2,1},...maze_{n,1},maze_{2,1},...,maze_{n,m}s1,s2,…,snm=maze1,1,maze2,1,...mazen,1原创 2020-12-16 22:02:53 · 316 阅读 · 1 评论 -
CodeForces - 933A A Twisty Movement(dp)
题目链接:点击查看题目大意:给出一个长度为 n 的数列,只由 1 和 2 组成,现在允许反转一段区间,问反转后的不下降子序列最长是多少题目分析:因为 n 只有 2000,所以考虑n2n^2n2去枚举所有的子区间进行反转然后维护答案,不过我们需要预处理出两个dp数组备用:dp1[ l ][ r ][ st ][ ed ]:区间 [ l , r ] 中首项为 st,末项为 ed 时最长不下降子序列的长度dp2[ l ][ r ][ st ][ ed ]:意义同上,只不过是反转之后的答案在枚举子区间原创 2020-12-16 21:45:18 · 240 阅读 · 0 评论 -
2020ICPC(上海) - Sum of Log(数位dp)
题目链接:点击查看题目大意:给出X 和 Y,求题目分析:因为涉及到了位运算且看似可以递推,所以考虑数位dp,因为统计答案时的 i 和 j 的与为 0,所以 i + j = i & j,那么取 log 其实就是最高位,也就是 max( highbit_i , highbit_j )最简单的状态就是:dp[ pos ][ highbit_x ][ highbit_y ][ x <= X ][ y <= Y ],不过很可惜会 TLE因为我们到达终点后,我们只关心 max( ..原创 2020-12-14 15:37:45 · 2069 阅读 · 6 评论 -
CodeForces - 431C k-Tree(dp)
题目链接:点击查看题目大意:给出一棵无穷大的有根树,每个节点都有 k 个儿子,每条边都有权值,分别是 1 ~ k,现在问从根节点向下走,有多少条路径的权值和等于 n ,且至少存在一条边权大于等于 d 的边题目分析:读完题感觉像背包问题,花了一个小时想了个三维 dp,四层 for 用来转移,正确性肯定是没问题的,只不过有点太画蛇添足了:dp[ i ][ j][ k ]:到了第 i 层,容量为j ,最大值为k时的方案数,转移的话一层枚举层数,一层枚举下一个数字,一层枚举容量,一层枚举最大值,非常啰.原创 2020-12-09 21:17:43 · 1317 阅读 · 5 评论 -
CodeForces - 466C Number of Ways(推公式/dp)
题目链接:点击查看题目大意:给出一个长度为 n 的数列,现在要求出满足条件的 ( i , j ) 的匹配数量,满足:题目分析:训练时推的公式,简单说一下吧,维护前缀和 sum,则确定两个断点 ( i , j ) 后可以确定下来三个区间:sum[ i - 1 ] sum[ j] - sum[ i - 1 ] sum[ n ] - sum[ j ]因为需要三段区间的权值和连等,根据等式的传递性,我们可以让前两项相等,再让后两项相等,最后不难推出三项连等,建立等式:前两项相等:sum[ i.原创 2020-12-08 22:17:25 · 415 阅读 · 4 评论 -
CodeForces - 137D Palindromes(dp+路径输出)
题目链接:点击查看题目大意:给出一个长度为 n 的回文串,问最小修改多少个字母,可以使得整个回文串可以被划分成不超过 k 个连续的回文串,并输出最终的划分方案题目分析:n 和小,考虑多维 dp首先预处理出 cost 函数辅助 dp 的转移,cost[ l ][ r ] 是将区间 [ l , r ] 内的字符串修改成回文串的最小花费,转移方程也比较简单 cost[ l ][ r ] = cost[ l + 1 ][ r - 1 ] + ( a[ l ] != a[ r ] ),时间复杂度是 O(原创 2020-12-04 13:13:22 · 402 阅读 · 0 评论 -
CodeForces - 336D Vasily the Bear and Beautiful Strings(dp+组合数学)
题目链接:点击查看题目大意:给出一个 01 字符串,规定求值的过程如下:每次选择末尾的两个数字: 如果为 0 0 ,那么替换成一个 1 否则替换成一个 0 循环往复,直至只剩一个数字位置,剩下的数字即为所求现在问,对于所有长度为 n + m 的 01 字符串中,同时满足下列条件的字符串有多少个恰好有 n 个 0 和 m 个 1 求值之后得到的答案等于 g(题目给出)题目分析:网上一堆纯组合数学的题解,但是边界需要判断的很麻烦,不太喜欢那种解法(也可能是我太菜了,看不明白大佬们的原创 2020-12-02 15:20:31 · 311 阅读 · 4 评论 -
CodeForces - 487B Strip(线段树+dp+二分)
题目链接:点击查看题目大意:给出一个长度为 n 的序列,现在要求分成尽可能少的子段,且每个子段需要满足:最大值与最小值的差值小于等于 s 子段长度大于等于 l题目分析:dp[ i ] 代表的是前 i 个数字分成最少的子段个数,转移方程如下:dp[ i ] = dp[ j - 1 ] + 1:第 i 项单独一段 dp[ i ] = dp[ j - 2 ] + 1:第 i 项与 i - 1 项组成一段 ... dp[ i ] = dp[ 0 ] + 1:第 1 ~ i 项组成一段显然是取原创 2020-11-25 21:50:01 · 239 阅读 · 0 评论 -
CodeForces - 1427C The Hard Work of Paparazzi(dp+剪枝)
题目链接:点击查看题目大意:给出 n 个点 ( x[ i ] , y[ i ] ),如果第 t[ i ] 可以到达这个位置,贡献就可以加一,行走需要花费的时间等于两点之间的曼哈顿距离,问最大贡献是多少题目分析:dp[ i ] 表示到点时的最大贡献,一个比较显然的转移方程是:O( n ) 枚举 j,满足 j < i,且满足两点的距离小于等于两点的间隔时间:dp[ i ] = max( dp[ j ] + 1 ),但问题是 n 比较大通过观察不难发现 r 比较小,又因为题目中保证了 t[ i原创 2020-11-25 21:29:21 · 301 阅读 · 0 评论