动态规划
“动态规划”学习
CCCCDEV_CCCC
志在四方少年,羡慕南飞的雁
展开
-
1877 音量调节
1877 音量调节原创 2022-07-14 21:45:03 · 179 阅读 · 0 评论 -
1616 疯狂的采药
1616 疯狂的采药原创 2022-07-10 08:33:54 · 73 阅读 · 0 评论 -
1026 统计单词
1026 统计单词原创 2022-07-08 15:01:39 · 216 阅读 · 0 评论 -
1096 汉诺的双塔问题
1096 汉诺的双塔问题哦不,哦不,哦不,哦不不不不这个题我早就见过,可惜当年太菜了这个题分两步,推公式和高精度,可惜我都不会我对这个题的题意还是理解的不够透彻,根本看不出来为什么要用看出来了首先我们可以退出来,b[n] = 2*b[n-1] + 1所以,我们就运用到了高精度然后为什么还得用一个函数呢,因为我们需要用一个辅助的柱子来表示移动的过程,这个函数就是用来干这事的#include<iostream>#include<cstdio>#include<原创 2021-10-10 21:35:29 · 208 阅读 · 0 评论 -
1504 积木城堡
1504 积木城堡貌似这个题可以用暴力来做?万物皆可暴力哈哈哈哈好了开始切入正题他灵机一动,想出了一个巧妙的改造方案。他决定从每一个城堡中挪去一些积木,使得最终每座城堡都一样高。为了使他的城堡更雄伟,他觉得应该使最后的城堡都尽可能的高所以这肯定就是一个动态规划看dp的必备:状态表示动态转移动态转移初始状态初始状态首先,dp[i][j]表示前i块积木是否能到达高度j#include<iostream>#include<cstdio>#include<原创 2021-10-10 11:32:15 · 228 阅读 · 0 评论 -
1564 膜拜
1564 膜拜貌似这个题是二分图?好像不是要么保证整一个机房都是同一个神牛的膜拜者,或者两个神牛的膜拜者人数,不超过m人很明显就是动态规划吗dp[i]表示i个人需要的最少机房数初始化dp[0]=0 dp[1]=1dp[i]=min(dp[j])+1,其中0≤j<i,并且区间(i,j)可以成段目标是dp[n]对于每一个数都有切割或者不切割两个可能什么时候切割呢?分三种情况,两个的人数之差小于m,或者都膜拜甲或者都膜拜乙那么这样就用切割那么不砍的话,dp自然不变如果砍,那就是上一个原创 2021-10-10 10:46:11 · 93 阅读 · 0 评论 -
1754 球迷购票问题
1754 球迷购票问题貌似这个题需要用卡特兰数,也就是用O1就能解决,不过我这个萌新真不会设f[i][j]表示是已经来了i个50人和j个100人的方案//https://iwo.im/?q= 这里介绍一个很好玩的百度游戏因为没开longlong,只有95分于是就有递推式if(i>j) f[i][j]=f[i-1][j]+f[i][j-1];//如果来的50的多于100的,那么这次来50和100的都可以else if(i==j) f[i][j]=f[i][j-1];//一样多,只能来原创 2021-10-10 10:19:58 · 274 阅读 · 0 评论 -
3399 丝绸之路
3399 丝绸之路哈哈,历史题,哈哈这个题好像和之前有一个题类似,也是一个貌似最短路径得题目,然后让你求最短的消耗值好像哪一个是模拟但是这一个肯定是动态规划,不用多想首先我们先要明确两个点,所有的城市连起来就是一条线,每一天都有走和不走两个选择然后就有方程f[i][j]=min(f[i-1][j-1]+d[i]*c[j],f[i][j-1])通过这里和前几个对动态规划的思考可以看出来,其实我们在假设(i j)的时候,是先假设(i-1 j-1)或者(i-1 j)是存在的并且保证最小的,而(i j原创 2021-10-10 09:17:10 · 74 阅读 · 0 评论 -
1481 魔族密码
1481 魔族密码貌似这个题是求最长上升序列貌似这个题用模拟就能求出来了dp[i]表示最长上升序列的长度然后只要能查找子串,就更新答案#include<iostream>#include<cstdio>#include<algorithm>#include<string> using namespace std;const int maxn=2010;int n,ans,dp[maxn];string s[maxn];int main原创 2021-10-10 00:16:36 · 73 阅读 · 0 评论 -
1566 加等式
1566 加等式暴力因该不会超时还是乖乖打动态规划吧其实定义f[i]表示和为i的方案个数然后从大到小进行枚举,这个题我存在一些疑问,为什么不用判断,直接加起来方案,不用判断等式吗?#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cstring>using namespace std;const int maxn=1e5+原创 2021-10-10 00:01:42 · 112 阅读 · 0 评论 -
2004 领地选择
2004 领地选择暴力枚举能得50分左右愣是不明白是啥意思,其实就是给定一个n×m的大小格子,还有每一个格子的价值,在给定一个c×c的方框,使得方框框起来的价值最大其实有点类似于二位前缀和了其实就是得用前缀和来做然后枚举出来每一个前缀和,保存最大的就好了感觉没什么难的好水啊,感觉和动态规划没啥关系#include<iostream>#include<cstdio>#include<algorithm>#include<cmath>#in原创 2021-10-09 23:39:14 · 175 阅读 · 0 评论 -
2049 魔术棋子
2049 魔术棋子貌似这个题,并没有啥思路dp[i][j][l]表示在位置(i,j)能不能得到l,也就是dp数组只能是1或0l*num[i][j]%k表示当前格子数乘从左边或上边传下来的数l再mod kdp[i-1][j][l]和dp[i][j-1][l]表示在上方或左方能不能得到l#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<alg原创 2021-10-09 23:22:30 · 69 阅读 · 0 评论 -
2327 扫雷
2327 扫雷这个题,其实就有一点类似于字符串,和字符串有着不可分割的一部分当然这个题用搜索也可以,这里我打算用两个方法深搜的思想,并不是太能理解如果假设后满足性质,说明这个地方就应该是雷子如果假设后破坏这个性质,这个地方不该有雷子如果这个题有点水,只有2×n个格子,所以用一维也行,将二维化成了线性的至于为啥判断八宫格的时候只需判断当前的,前一个和后一个就行了因为在两个八宫格内,会有交叉的,所以我们只需要判断不交叉#include<iostream>#include<c原创 2021-10-09 22:23:17 · 124 阅读 · 0 评论 -
2031 脑力达人
2031 脑力达人其实动态规划真的在解决字符串上是很牛的,kmp其实就是一种基于动态规划的东西#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int f[310];int main(){ int i,n,l; bool x; char s[310],si[510][310];原创 2021-10-09 21:26:08 · 66 阅读 · 0 评论 -
1435 回文字串
1435 回文字串如果这个题用枚举来做,因该也可以过不过貌似并没有人用暴力来做啊貌似这个题并不难理解,需要学会转化问题首先先从谈样例入手,ab3bd它的倒序就是,db3ba大胆地猜想,这样就能转化成什么问题呢?可以这样来理解,正序与倒序的重合部分就是回文的部分,如果把公共的部分减去就能求出来所要添加的部分了这样不就求出来了吗#include<iostream>#include<cstdio>#include<algorithm>#include&l原创 2021-10-09 17:33:59 · 57 阅读 · 0 评论 -
1970 花匠
1970 花匠这个题呢,和上回wyq老师出的题差不多,我用一次就AC了,这样的题目叫做波形动态规划题目是用来解决类似于山峰的题目首先,我们定义一个数组f[i][0/1]第一个维度表示位置,第二个维度表示上升或者下降所以,对于每一个状态都有两个情况,前面是上升或者下降啥意思全网并没有解释清楚我来!【【【【对于每一个点,他要么是一个转折点,要么就是持续点;换句话说,要么它前面都是递增的,要么它上面是递减的所以就分了四个情况来讨论#include<iostream>#incl原创 2021-10-07 22:05:09 · 65 阅读 · 0 评论 -
1057 传球
1057 传球国庆最后一道题,做完赶紧肝作业其实这一个题就比较简单了,因为我学会了套用五部曲了,真棒!感觉这个题算是dp中比较基础的了,首先,我们先弄明白这个题中,我们需要维哪些信息,一个是次数,一个是左右的人所以我们的f数组则有两个维度f[i][j]表示第i次的位置为j的方案,所以左边就是j-1右边就是j+1,但是这个序列是一个环形的,所以需要控制1和n,在约瑟夫中也有体现,然后就套用公式就好了#include <iostream>#include <cstdio>u原创 2021-10-06 14:49:19 · 71 阅读 · 0 评论 -
总结动态规划
总结动态规划动态规划,我爱你,但是我也深深的恨着你动态规划,这四个词,是OI路上的必经之路,也是OI路上的必虐之地共有几个种类,基础的背包问题,打家劫舍,股票,子序列问题对于任何一个动态规划题目,都有:1.dp数组的定义和维度的意义2.递推公式,这个东西往往是解题的关键,突破口3.初始化,也就是边界,它紧贴着dp数组的定义4.遍历的顺序,也就是for循环的循环范围,这个也很重要,在背包中很有体会5.打印数组,这是啥,就是输出的什么,也就是将dp数组查出来看看对不对,这一步就是检查的步骤原创 2021-10-06 14:13:09 · 80 阅读 · 0 评论 -
一本通之动态规划合集
1258 数字金字塔一本通的题目相比与洛谷的题好的多,所以,我们来练习一本通的题目吧只要把一本通的这些题全部弄透,考场上不用怕然后再练练搜索,就可以复习了模板题,数字三角形的动态规划还有就是这一篇文章我将把他们和一起来解决其实数字三角形并不难,只需要套公式就好了,数字三角形的公式也不难理解#include<iostream>#include<cstdio>#include<algorithm>#include<string>#includ原创 2021-10-03 18:17:07 · 176 阅读 · 0 评论 -
2392 kkksc03考前临时抱佛脚
2392 kkksc03考前临时抱佛脚搜索啊,怎么找到的?从写挂的里面找到的首先,一个思路就是贪心如果左脑的所用时间少就加在左脑,如果右脑所有时间少就加在右脑所以,贪心肯定不对#include<iostream>#include<cstdio>#include<algorithm>#include<string>using namespace std;int a[5];int sum1,sum2;int t,homework;int m原创 2021-10-03 10:59:07 · 154 阅读 · 0 评论 -
3903 导弹拦截Ⅲ
3903 导弹拦截Ⅲ又是导弹拦截嘿嘿嘿马上就要去金乡了,好开心啊做完这一道题,就结束了,我去学文化课了,洛谷上的搜索到此结束,开始杀向一本通ok了,切入正题嗯?貌似这个题需要跑两个最长不下降子序列?纯属猜测这个题就是在上一个导弹拦截的基础上,求一连串最长序列,可是这条序列的第奇数个要比前一个高,偶数的一个比一个个短那么,我们就可以分奇数偶数位置来,也就是说,如果是第奇数个,我们就找前一个的最长的偶数;如果是第偶数个,我们就找前面一个的奇数if(a[j]<a[i]) dp[i][1]=原创 2021-10-02 15:11:49 · 76 阅读 · 0 评论 -
1103 书本整理(深究dp)
1103 书本整理绿色的动态规划太难了,在考场上我也肯定不会,所以我选择了放弃#include<iostream>#include<cstdio>#include<algorithm>#include<string>#include<cstring>using namespace std;int n, k, m, Min = 0x7fffffff;int f[501][501];//f[i][l]:以i作末尾,选了l本书时的最小原创 2021-10-02 13:04:10 · 76 阅读 · 0 评论 -
1004 方格取数
1004 方格取数这个题和去年那一道的方格取数不一样,他需要走两次,找到两个路径我早就做过,不过只有20分,做的时候是去年,那时候我太垃圾了,现在我重新杀来然后呢,因为是两个路径,那么状态必定就是四维f[i][[j][l][k]表示第一个人走到(i,j),第二个人走到(l,k)的最大值那么方程是啥,其实类似于数字三角形就是方程了然后需要特殊判断i=k j=l的情况,因为只能取一次一年了,终于切了#include<iostream> #include<cstdio>原创 2021-10-02 09:30:26 · 80 阅读 · 0 评论 -
5662 纪念品
5662 纪念品为啥没做过这个?不知道,可能觉得很难吧没关系,现在来做做t天之后,小伟的超能力就会消失,他要在这t天之内卖出所有的纪念品所以,很明显,这就是一个动态规划问题但是状态呢,怎么玩状态?状态貌似在这个题目中很好突破也很变态于是我们定义一个数组f[i][j][k]来记录第i天,考虑到第j个物品1,手里面还有第k元的时候,明天早上能卖掉的最大的金币数量,然后就类似于背包的思路了我们用prise[i][j]表示第i天第j个物品的价格那么方程式就是f[i][j][k]=max(f[i][原创 2021-10-01 15:45:10 · 73 阅读 · 0 评论 -
1049 装箱问题
1049 装箱问题其实并没有什么,我只不过是想来练练手,练练背包的模板注意不要忘记将n和m弄颠倒#include<iostream>#include<cstdio>#include<algorithm>#include<string> #include<cstring>using namespace std;int n,m;int f[20010];int w[100];int main(){ int i,j; cin原创 2021-10-01 13:31:12 · 65 阅读 · 0 评论 -
1044 栈
1044 栈这个题早就弄过,就是用来模拟栈,貌似是在去年的时候做的,还有就是自己比较薄弱的地方就是用栈来模拟表达式,一会再训练一下输入栈的个数,然后输出合法的出栈序列这个题很基础,很基础很基础的,定义f[i][j]数组i表示待入栈的元素和待出栈的元素,所以列出来的递推式,就是f[i][j]=f[i][j-1]+f[i-1][j+1]这个式子的含义,当前的这个元素入栈的方案数加上这个元素不入栈的最大方案数也就是两个选择,通过选择来列举方程式子’,两个选择是啥,出去或者不出去#include<原创 2021-10-01 12:30:44 · 71 阅读 · 0 评论 -
1077 摆花&动态规划醒悟
1077 摆花貌似这个题早就做过了,不过当时理解并不透彻吧貌似这个题目是环形dp首先我们设f[i]就是我们所求的摆放花盆的种数,算是dp中比较基础的了首先我们需要枚举每一种花,然后对于每一种花再枚举每一盘,最后枚举每一种花的分数进行更新貌似这样说不对,我也不知道怎么解释这道题了再来总结一下,从大范围到小范围进行一个一个枚举,先枚举每一盆,在枚举每一株花,从大到小进行初始化的时候需要将f[0]=1表示没有花的时候也得进行摆放,所以,不能设置成f[1],听说有人这一点错了不少/xyx算是比较基础原创 2021-10-01 11:55:29 · 175 阅读 · 0 评论 -
1095 守望者的逃离
1095 守望者的逃离守望者的逃离,这个题和我一样大的,不得不说,那个年代的想象力就这么丰富了看这道题的第一眼我还以为是一个最短路径呢,不过我感觉这个题和最短路经不会有太大的差异首先对于dp,先要找到状态,就是时间,也就是一个f数组, 不需要辅助数组f数组表示的当前时刻i能走多远所以对于这个题,更像贪心,能瞬移就瞬移,不能瞬移就等能量恢复了#include<iostream>#include<algorithm> #include<string>usin原创 2021-10-01 11:16:27 · 58 阅读 · 0 评论 -
1158 导弹拦截
1158 导弹拦截这个题是第一个导弹拦截题目的11年后,所以,题目也运用了11年后这个题貌似有点绿色了,涉及到平面坐标的问题,这一类问题我们练习过,有点生疏这个题也就是从距离的一维又加上了导弹半径...原创 2021-10-01 10:08:39 · 90 阅读 · 0 评论 -
1020 导弹拦截
1020 导弹拦截200分的普及组真题,分三道,需要全部训练,训练动态规划,动态规划和搜索以及排序都是非常重要的先从dp,再从fs,最后排序首先这个题需要求两个值,一个最长不下降子序列,因为我们要拦截这个导弹,一个是最长下降子序列,因为我们要让拦截的系统变小好了,我们发现一个东西,也就是f数组就是相当于方程中的x,所以f数组的定义就是以i结尾的最长不上升子序列的长度,然后我们需要用一个d数组来辅助f变量,d数组维护的是导弹的最后一个位置,然后再用t记录最大的答案就好了其实感觉并不难,很经典的今天原创 2021-09-29 22:10:57 · 83 阅读 · 0 评论 -
7073 表达式
7073 表达式其实这个题我不怎么理解,就是感觉很牛,很蓝,但是还很不会先来理解一下题意:给定一个逻辑表达式,是一个以后缀表达式的形式,然后给定几个操作,再取反这个操作的值,求表达式的值然后这道题肯定是用栈来求,而且是手写的栈,虽然难操作,但是时间快我们要求的是?某一个变量的改变会不会对最终的值造成影响首先我们先设立一个f数组,用fi表示第i个数或运算的改变会直接影响到哪一个运算的结果那么怎么求fi?...原创 2021-09-28 22:09:51 · 91 阅读 · 0 评论 -
7074 方格取数
7074 方格取数既然提高组没有过,那么就开始备战普及组吧,加油奥里给,今年一定要杠一个一等奖啊方格取数问题,可以说是去年题目中,有思路但是无法实现一道毒瘤题典型的区间dp题目,题目没有什么,就是从起点开始走步,每次取数,不能走出边界,求最大值首先我们想到的的第一种做法就是暴力搜索,这种做法肯定不对的,但是操作很简单,很好想,三个方向进行扫描,只有几分,不过为什么考场上不会骗骗分?接下来我们研究一下比较真确的解决方案,叫做最优化剪枝,说白了还是暴力,不过就是在原基础上剪枝,虽然不是满分,但是也算是原创 2021-09-27 21:45:50 · 101 阅读 · 0 评论 -
1352 没有上司的舞会
1352 没有上司的舞会早就做过不过我写挂了貌似这是个树形DP的题,不过搜索没什么不同的邀请哪些职员可以使快乐指数最大,求最大的快乐指数emmmmmmm很明显,一看就是和动态规划有关系f[x][0]表示以x为根的子树,且x不参加舞会的最大快乐值f[x][1]表示以x为根的子树,且x参加了舞会的最大快乐值所以最后的答案就是max(f[root][0],f[root][1])那么则f[x][0]=max(f[y][0],f[y][1]) (y是x的儿子)f[x][1]=f[y][0]+h原创 2021-08-30 16:43:52 · 52 阅读 · 0 评论 -
1600 旅行计划
1600 旅行计划单调队列优化DP#include <bits/stdc++.h>using namespace std;typedef long long ll;inline ll read(){ ll s=0; bool f=0; char ch=' '; while(!isdigit(ch)) { f|=(ch=='-'); ch=getchar(); } while(isdigit(ch)原创 2021-08-05 16:56:13 · 91 阅读 · 0 评论 -
1705 Telephone Wire
1705 Telephone WireDP的前缀优化电话线假设在 n根电话杆上,第 i 根电话线高度为h[i] (1<=h[i]<=100) 如果两根电话杆高度不同,则需要花费 c * 电话杆高度差(1<=c<=100)的费用,你不能移动电话杆,只能按原有顺序架设电话线现在你可以加高某些电话杆,加高 x 米需要花费 x2的代价,求最少花费首先发现h[i]并不大,所以可以作为状态设f[i][j]表示架设到了第i根电话杆并且长度为j的最小代价f[i][j]=min( f[i-原创 2021-08-05 16:24:32 · 78 阅读 · 0 评论 -
DP单调队列优化
DP单调队列优化单调队列DP是指列完转移方程后然后转换为一个左右端点递增的区间询问最值的问题这是官方语言,不太明白单调栈单调队列的本质是借助单调性,及时排除不可能的情况,从而使维护的集合保持一些优美的性质先看一道例题,最大连续和给定长度为n的序列,找出连续长度不超过m的子序列,使得子序列和最大利用前缀和的思想计算每一位,模拟寻找的子序列,因为要使得子序列的和最大,所以直接将前缀和当作值跑一遍单调队列即可复制代码到粘帖板#include <iostream>#include &l原创 2021-08-05 15:51:53 · 141 阅读 · 0 评论 -
DP函数优化
DP函数优化这种优化方式不难理解,不难想象,之前做过的一道题中记录了这种做法,通常用来优化线性DP,最长上升子序列设注意如果a[i]<a[j]并且d[i]=d[j]那么对于后续状态k(k>i&&k>j)来说,i不会比j差,所以我们只需要保留i这个状态,一定不会损失最优解因此对于相同的d,只需要保留a[i]就好了所以可以用lower_bound函数进行优化这样的结果只能求长度,很难输出具体的序列,但是能完成动态规划int main(){ memset(g.0原创 2021-08-05 15:15:05 · 227 阅读 · 0 评论 -
1433吃奶酪
1433吃奶酪问至少要跑多少距离,状态压缩DP一般这种状态压缩DP都和搜索有关系状态压缩的时间复杂度都是确定的,这一点很nice首先设f[i][s]表示从i出发遍历集合为s的点的路程最小值,枚举s里其他点进行转移然后就很简单了,状压好难呜呜呜#include<cstdio>#include<cmath>#include<cstring>typedef double db;db x[20],y[20],f[20][35000];template<原创 2021-08-05 14:55:23 · 49 阅读 · 0 评论 -
1592 国王
1592 国王练习状压DP…求使它们无法互相攻击的方案总数,动态规划,其实和dfs有点像,类似于n皇后问题n<=10,数据范围真的是可以了,但是深搜的话,时间复杂度会指数爆炸一样,不要想了因为对于每一个格子都有放或者不放两种情况,那么就可以用二进制来来优化那么一行的数据就浓缩成一个数了怎么设计状态?我们要在n×n的棋盘放k个国王,那么就用f[i][j][k]表示第i行状态是a[j],目前放了k个棋子f[i][j][k]=sum{ i-1,l,k-num[j] }其中l枚举上一行状态的变原创 2021-08-05 13:30:07 · 72 阅读 · 0 评论 -
状压DP
状压DP顾名思义,就是把状态压缩起来比如对于8*8的棋盘,每一个位置可以放一个棋子对于在第i行第2个位置和第6个位置放了棋子,我们可能需要8维或者9维去维护所以我们就把一行状态压缩成一个数字的做法一般可以转化二进制,如果每一个位置有三种状态,那么可以转化成三进制这样我们只需要一个长度为8的一维数组就可以存下所有的状态这就是状态压缩嗯,可能明白了,道理谁不会?模板谁不会?难的是做题大道理都明白,会做题才是王道...原创 2021-08-05 12:01:06 · 49 阅读 · 0 评论