动态规划
如题
Yuhan の Blog
这个作者很懒,什么都没留下…
展开
-
洛谷 P1434 [SHOI2002]滑雪(记忆化搜索)
题目链接:https://www.luogu.com.cn/problem/P1434思路:1.设len[i][j]为从i行j列的格子为起点的滑坡的最大长度;2.若直接使用递推,需要扫R∗CR*CR∗C遍区域,复杂度为O(R2C2)O(R^2C^2)O(R2C2),会TLE;3.另一个想法是使用一趟dfs得到len[i][j]的值,使用R∗CR*CR∗C趟即可得到所有的值,选取其中最大的即为答案;注意中间保留所有的搜索结果以便于之后减少重复搜索;代码:#include <bits原创 2021-02-04 20:23:53 · 231 阅读 · 0 评论 -
洛谷 P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles(dp)
题目链接:https://www.luogu.com.cn/problem/P1216思路:1.若用二维数组来存储数字三角形,设xi,jx_{i,j}xi,j是从顶端走到第iii行第jjj列时的最大和、ai,ja_{i,j}ai,j是存储数字三角形的二维数组对应位置的值,则可得xi,j=max(xi−1,j,xi−1,j−1)+ai,jx_{i,j}=max(x_{i-1,j},x_{i-1,j-1})+a_{i,j}xi,j=max(xi−1,j,xi−1,j−1)+ai,j2.原创 2021-01-30 20:24:21 · 206 阅读 · 0 评论 -
蓝桥杯 PREV-28 地宫取宝(dp)
题目链接:http://lx.lanqiao.cn/problem.page?gpid=T120思路:1.记dp[i][j][a][b]dp[i][j][a][b]dp[i][j][a][b]为走到坐标为(i,j)(i,j)(i,j)位置后,手上有aaa件物品且所有物品中最大值为bbb的方案数;2.假设我们现在从(a,b)(a,b)(a,b)走到(x,y)(x,y)(x,y)(这两个...原创 2020-03-31 13:21:23 · 181 阅读 · 0 评论 -
洛谷 P1060 开心的金明(0/1背包)
题目链接:https://www.luogu.com.cn/problem/P1060思路:背包裸题代码:#include<bits/stdc++.h>using namespace std;const int maxn = 3e4 + 5;int n, m, v[maxn], p[maxn];int dp[maxn];int main() {#if...原创 2020-03-05 14:44:36 · 159 阅读 · 0 评论 -
蓝桥杯 PREV-30 波动数列(0/1背包)
题目链接:PREV-30 波动数列思路:设这个数列首项为AAA,由题意可知总和一定可以表示成nA+xa−yb(x+y=n(n−1)2)nA+xa-yb(x+y=\frac{n(n-1)}{2})nA+xa−yb(x+y=2n(n−1))的形式,其中xxx为+a+a+a操作的次数和,yyy为−b-b−b操作的次数和;那么我们有nA=s−xa+yb(x+y=n(n−1)2&0≤...原创 2020-02-19 15:05:20 · 207 阅读 · 0 评论 -
蓝桥杯 PREV-15 格子刷油漆(dp)
题目链接:PREV-15 格子刷油漆思路:这个2∗n2*n2∗n的城墙,我们将四个端点和非端点分开考虑;|------------------------------------------------------------------------------------|我们设dp[n]dp[n]dp[n]为:有nnn列时,从某一端点为起点,一共多少种刷漆方法;从端点开始我们...原创 2020-02-17 16:59:18 · 271 阅读 · 0 评论 -
蓝桥杯 PREV-8 买不到的数目
题目链接:PREV-8 买不到的数目思路:结论:a,b为质数,x,y为非负整数,则ax+by最大不能表示的数为ab-a-b,因此ab-a-b即为答案;但是题目似乎并没有说a,b为质数?所以严谨一点还是用动态规划吧;代码:#include<bits/stdc++.h>using namespace std;const int maxn = 1e7 + 99;...原创 2020-02-15 16:09:21 · 154 阅读 · 0 评论 -
团体程序设计天梯赛 L3-020 至多删三个字符 (30分)(DP)
题目链接:L3-020 至多删三个字符 (30分)思路:PAT顶级有一道类似的,至多删两个字符最多能得到多少不同字符串,题解就请参考这篇啦:https://blog.csdn.net/qq_45228537/article/details/103033486重点就是去重过程;代码:#include<bits/stdc++.h>using namespace s...原创 2020-01-31 13:40:02 · 402 阅读 · 0 评论 -
团体程序设计天梯赛 L3-001 凑零钱 (30分)(0/1背包)
题目链接:L3-001 凑零钱 (30分)思路:将每个硬币的面值既当作它的价值也当作它所消耗的容量,我们的目标即是在容量为m的情况下,所能得到的最大总价值能否为m;既然是求一定容量下的最大价值,那么就是经典的0/1背包问题了;我们需要打印出最大价值的情况下所选取的所有硬币,我们只能从后往前打印,因此我们将初始的价值降序排序,从而在从后往前选取路径时先选取的是面值小的硬币;代码:...原创 2020-01-28 15:26:41 · 457 阅读 · 0 评论 -
Codeforces 1287C Garland
题目链接:Codeforces 1287C Garland思路:我们记dp[i][j][0]和dp[i][j][1]分别为第i个为奇数/偶数且前i个里面有j个偶数的情况下,第i个的最小复杂度;很容易得到第i个是奇数/偶数时的递推关系;当第i个是空着时,它取奇偶都可以,我们均递推一下取最小即可;最终答案就是前n个偶数为n/2个的情况下,取[0]和[1]的最小值;代码:#incl...原创 2020-01-16 22:33:49 · 1075 阅读 · 0 评论 -
Codeforces 1288C Two Arrays
题目链接:Codeforces 1288C Two Arrays思路:先考虑这样一个问题:设数列a是非降序数列,一共有m项,a的所有值不超过y且首项为x,那这样的数列一共有多少个?设dp[i][j]dp[i][j]dp[i][j]为第iii项取x+j−1x+j-1x+j−1的种数,则可以得到递推式dp[i][j]=(dp[i][j−1]+dp[i−1][j])dp[i][j] = ...原创 2020-01-15 20:10:35 · 594 阅读 · 0 评论 -
PAT顶级 1007 Red-black Tree (35分)
欢迎大家访问我的PAT TOP解题目录~https://blog.csdn.net/qq_45228537/article/details/103671868题目链接:1007 Red-black Tree (35分)思路:我们定义r[i][j] b[i][j]分别为以红色、黑色的点为根节点,black height为i,internel node数量为j的情况下,所能形成的...原创 2020-01-13 00:11:58 · 980 阅读 · 0 评论 -
PAT顶级 1025 Keep at Most 100 Characters (35分)
题目链接:1025 Keep at Most 100 Characters (35分)思路:用dp[i][j]记录字符串从第一个字符到第i个字符形成的子串、保存j个字符所形成的sub-sequence个数;则我们可以得到递推式dp[i][j]=dp[i−1][j]+dp[i−1][j−1]dp[i][j]=dp[i-1][j]+dp[i-1][j-1]dp[i][j]=dp[i−1]...原创 2020-01-03 23:16:39 · 350 阅读 · 0 评论 -
HDU 2196 Computer(树形DP)
题目链接:2196 Computer思路:1.对于每一个结点iii,我们需要计算三个值:dp[i][0]:dp[i][0]:dp[i][0]:以iii为根的子树里,iii往下能达到的最大长度;dp[i][1]:dp[i][1]:dp[i][1]:以iii为根的子树里,iii往下能达到的次大长度;dp[i][2]:dp[i][2]:dp[i][2]:结点iii往上走,能达到的最长长...原创 2019-12-26 17:10:49 · 80 阅读 · 0 评论 -
HDU 1520 Anniversary party(树形DP)
题目链接:1520 Anniversary party思路:1.题意:父亲和儿子不能一起出现,问能一起出现的所有结点值的最大值;2.设dp[i][0]dp[i][0]dp[i][0]和dp[i][1]dp[i][1]dp[i][1]分别是以iii为根的子树、iii结点出现和不出现时的结点值最大值,设sonsonson为结点iii的儿子,则有dp[i][0]+=max{dp[son]...原创 2019-12-26 16:56:48 · 110 阅读 · 0 评论 -
Codeforces 1282B2 K for the Price of One (Hard Version)
题目链接:1282B2 K for the Price of One (Hard Version)思路:首先排序,再设dp[i]是index从0买到i为止的最小开销,然后以贪心思想递推;最后求满足dp[i]<=p的最大i即可代码:#include<bits/stdc++.h>using namespace std;typedef pair<int,i...原创 2019-12-25 19:10:22 · 285 阅读 · 0 评论 -
PAT 顶级 1017 The Best Peak Shape (35分)(最长上升子序列)
题目链接:1017 The Best Peak Shape (35分)思路:1.LIS(Longest Increasing Subsequence)是动态规划里的一个基本类型,我们需要掌握它的O(nlogn)O(n\log n)O(nlogn)的算法;(不会的朋友自行学习~)2.其基本操作就是每次二分dp数组,往里面写值,如果a[i]被写到dp[k],就说明以这个值为结尾的LIS...原创 2019-12-25 19:00:50 · 369 阅读 · 0 评论 -
PAT顶级 1002 Business (35分)(0/1背包)
思路:1.每份工作只有做和不做,问最大利润,自然就能想到0/1背包问题;2.设dp[i][j]dp[i][j]dp[i][j]表示用jjj天的时间,在前iii个工程中所能获得的最大利润,设wk[i]wk[i]wk[i]为第iii个工作,wk[i].prowk[i].prowk[i].pro、wk[i].costwk[i].costwk[i].cost和wk[i].ddlwk[i].ddlwk...原创 2019-12-17 18:36:17 · 570 阅读 · 0 评论 -
CCF CSP 201612-4 压缩编码(区间dp+平行四边形优化)
思路:稍微理解一下就可以看出来就是裸的石子合并问题;利用区间dp加上平行四边形优化可以直接解出来;复杂度接近O(n2)O(n^2)O(n2)代码:#include<bits/stdc++.h>using namespace std;typedef long long LL;const int maxn=1005;const LL INF=1ll<<62...原创 2019-12-11 16:56:38 · 211 阅读 · 0 评论 -
Codeforces 1265E Beautiful Mirrors(概率DP,逆元)
思路:1.记dp[i]为通过第i面镜子的期望天数,pi为通过第i面镜子的概率,则我们可以得到dp[i]=dp[i-1]+pi*1+(1-pi)*(dp[i]+1),其中的dp[i-1]为走到第i-1的期望天数,此时我们有pi概率只需要再走一天,有1-pi概率需要再走1+dp[i]天(往前走一天,失败,然后再走通过i的期望天数);2.除法取模需要用到逆元;代码:#include<b...原创 2019-12-09 15:57:59 · 245 阅读 · 0 评论 -
HDU 3506 Monkey Party(区间dp)
思路:1.这题是经典区间dp问题“石子合并”的一个变型;2.“石子合并”是没有围成环的情况,设dp[i][j]为将从i到j的石子合成一堆的最小花费(本题即是i到j所有猴子认识的花费的时间),则有递推dp[i][j]=min(dp[i][j],d[i][k]+dp[k+1][j]+sum(i,j))其中sum(i,j)是i到j所有石子的总数目,k从i遍历到j-1;3.这种算法的时间复杂度为O...原创 2019-12-01 21:19:52 · 249 阅读 · 0 评论 -
POJ 3280 Cheapest Palindrome(区间dp)
思路:定义dp[i][j]为将i到j位置的字符串转换为回文串,我们从小到大放大这个区间,定义w[c-'a']为字母c的花费,可得dp[i][j]={dp[i+1][j−1]s[i]==s[j]min(dp[i+1][j]+w[s[i]−′a′],dp[i][j−1]+w[s[j]−′a′])s[i]!=s[j]dp[i][j]=\begin{cases}dp[i+1][j-1]&...原创 2019-12-01 18:41:15 · 131 阅读 · 0 评论 -
HDU 1257 最少拦截系统(LIS)
思路:1.该题题意是求不严格递减的子序列(即序列中相邻元素可以相等)个数最少有多少个;2.有一个结论:该序列中最长递增子序列(LIS)的长度即为不严格递减子序列最少的个数;严格证明(有一部分不会证orz):(1)首先证明LIS中任意两个元素都来自不同的递减序列:如果存在a和b,在原序列中,a的位置在b之前,如果它们在LIS中,则满足a<b,如果在同一递减序列中则满足a>=b...原创 2019-11-23 17:24:39 · 137 阅读 · 0 评论 -
HDU 2602 Bone Collector(0/1背包)
思路:1.设dp[i][j]为前i个物品中,可以装进体积为j的背包里,所有物品的最大值;2.设val[i]为第i个物品的价值,vol[i]为第i个物品的体积,则我们可以得到dp[i][j]={dp[i−1][j]j<vol[i]max(dp[i−1][j],dp[i−1][j−vol[i]]+val[i])j>=vol[i]dp[i][j]=\begin{cases}dp[...原创 2019-11-23 14:48:19 · 153 阅读 · 0 评论 -
HDU 2069 Coin Change
思路:1.设dp[i][j]表示用i个硬币可以组成j元的种数;2.我们需要避免出现类似5+1和1+5这种同一情况的重复计算,因此我们分先后次序依次递推所有面值的硬币(即将对面值的遍历放到循环最外圈);3.设coin[k]是当前遍历到的面值,我们可以得到递推关系dp[i][j]=dp[i][j]+dp[i-1][j-coin[k]];代码:#include<iostream>...原创 2019-11-23 13:42:46 · 102 阅读 · 0 评论 -
Codeforces 1253C Sweets Eating
思路:1.按照贪心的思想,吃k个糖果一定吃从小到大前k个糖果,且ai大的放在前面吃,因为放在后面吃要翻倍;2.在草稿上稍微画一下图就可以知道,从吃k个糖果到吃k+1个的过程中,我们需要加上a[k+1]+a[k+1-m*1]+a[k+1-m*2]+...+a[(k+1)%m](这里的数组a[]是升序排序后的),我们可以设立一个前缀和数组sum[k+1],它的值就是前面以a[k+1]开始的求和表...原创 2019-11-22 20:56:21 · 172 阅读 · 0 评论 -
PAT 顶级 1020 Delete At Most Two Characters (35 分)
思路:1.这题用dp[i][j]来表示,从字符串下标从0到i的子串删除j个字符后有多少种情况;2.不难得到递推式dp[i][j]=dp[i-1][j-1]+dp[i-1][j];3.处理边界情况:对于所有j==0有dp[i][0]==1;dp[0][]={1,1,0};4.在上面第二点相加时可能会出现重复情况,即删去第i个和不删第i个里面重复的串,因为不删第i个那这个串最后一个肯定是s[...原创 2019-11-12 17:16:27 · 397 阅读 · 0 评论 -
CCF CSP 201312-4 有趣的数
试题编号: 201312-4 试题名称: 有趣的数 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次。 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。 3. 最高位数字不为0。因此,符合我们定义的最小的有趣的数...原创 2019-09-17 23:05:45 · 230 阅读 · 0 评论 -
CCF CSP 201409-5 拼图
在写这题时,先后根据不同博客学习了状压dp、矩阵快速幂,最后代码有些小bug参考了一位思路差不多的大佬以做出修改,在这里先感谢三位大佬,之后会在思路里贴出他们的博文链接;知乎上好多人喷CSDN怎样怎样,我觉得静下心来,在这一篇篇博文里还是能学到很多东西的嘛…思路:1.使用状态压缩动态规划来求递推式;2.不会状压dp的请看这位大佬的博客: https://blog.csdn.net/u011...原创 2019-10-29 17:51:13 · 900 阅读 · 0 评论 -
Codeforces 1256E Yet Another Division Into Teams
思路:这题参考的自带题解的思路:Let’s sort all students by their programming skills but save the initial indices to restore the answer.Now we can understand that we don’t need to compose the team of size greater ...原创 2019-11-10 15:38:54 · 163 阅读 · 0 评论 -
Codeforces 1245C Constanze's Machine
思路:1.设dp[i]是连续的i个u或n最多能还原成的字符串个数;2.观察相邻几个i之间的关系,不难得出递推式:dp[i+2]=dp[i+1]+dp[i] (i>=2);3.字符串里不能出现w或m,出现了输出0;4.最后所有情况相乘,记得中间每一步取余防止溢出;代码:#include<bits/stdc++.h>using namespace std;type...原创 2019-11-11 20:48:03 · 295 阅读 · 0 评论