dp动态规划
文章平均质量分 63
程序设计竞赛中dp相关知识
小飞猪Jay
远风知我意,微凉又深情。
展开
-
最大化子数组的总成本
最大化子数组的总成本,超级简单易懂的DP算法!原创 2024-06-23 13:19:52 · 211 阅读 · 0 评论 -
2681. 英雄的力量
英雄的力量原创 2023-08-01 14:06:32 · 332 阅读 · 0 评论 -
834. 树中距离之和
树型DP原创 2023-07-16 16:17:22 · 272 阅读 · 0 评论 -
小红的数组操作
那再换句话说,既然改变的是总和的值,总和改变,平均数也随之改变,所以改变的就是平均数的值,那平均数不一定十是个整数,所以和平均数对应的是余数。也就是说,总和对应的是平均数的余数,平均数是整数,余数是0,不是整数,余数是其他数。ok,分析到这里,实际上分析的结果就是,我们要求的是总和除以n之后的余数为0的最小代价是多少,实际上我们只需要对初始状态的余数进行加和减的操作就行了,然后进行代价的更新。首先可以想到的一点是,虽然是说对每个数有两种操作,实际上因为要改变的是总和的值,也就是在总和的基础上执行两种操作。原创 2023-07-10 13:06:10 · 657 阅读 · 0 评论 -
游游的9的倍数
你这么看肯定是看不懂的啊,你得看dp[4][1]里面的 1 是怎么来的,是a[i]+j 得到的,也就是(8+2)%9=1。首先是前一个位置余数是 (j+a[i])%9 的数量,也就是dp[i-1][(j+a[i])%9],也就是说不算当前 i 位置的数,就已经有这些数量了。dp[i][(j+a[i])%9],就应该是当前位置余数是(j+a[i])%9的数量加上当前位置之前的余数是 j 的数量,这样才是总数量。dp[i][(j+a[i])%9]:i 位置及之前余数是 (j+a[i])%9 的数量。原创 2023-07-06 22:49:59 · 362 阅读 · 2 评论 -
1335. 工作计划的最低难度
动态规划原创 2023-05-16 20:04:11 · 402 阅读 · 0 评论 -
1263. 推箱子
推箱子原创 2023-05-08 21:20:32 · 870 阅读 · 0 评论 -
1031. 两个非重叠子数组的最大和
dp,两个非重叠子数组的最大和原创 2023-04-26 12:13:18 · 468 阅读 · 0 评论 -
1105. 填充书架
填充书架原创 2023-04-23 12:40:22 · 248 阅读 · 0 评论 -
1027. 最长等差数列
最长等差数列原创 2023-04-22 15:30:03 · 459 阅读 · 0 评论 -
1043.分隔数组以得到最大和
DP原创 2023-04-19 14:43:32 · 211 阅读 · 0 评论 -
ACWing 4958.接龙数列
注意到,j 从0到i 搜索一遍的目的其实就是找到r[j] == l[i]的最大的f[j] , 而这里的r 其实只有0到9十个数,因此这里我们只需要用一个g 数组来存储l[i]结尾的最大序列长度,就可以将j 的这层循环优化掉。例如 12,23,35,56,61,1112,23,35,56,61,11 是接龙数列;12,23,34,5612,23,34,56 不是接龙数列,因为 5656 的首位数字不等于 3434 的末位数字。,ANA1,A2,…对于 20%20% 的数据,1≤N≤201≤N≤20。原创 2023-04-15 15:40:45 · 413 阅读 · 0 评论 -
5.最长回文子串
OK , 处理完长度为2的之后,j 开始从 3 到 l(字符串长度) 开始遍历,当长度为 j 的时候,i 从0 也就是第一个字符开始枚举,那如何判断 i 为初始字符且长度为 j 的字符串是不是回文串呢?你能想到最笨的方法是什么?从字符串的长度开始向长度为 1 开始枚举,然后判断此长度下的所有可能的字符串是否满足回文串。从小到大就不一样了,如果这个小的子串是回文串,那么如果他两端的字母是一样的,那加上两端的大的字符串也是回文串。本题中的最大长度仅仅是1000,那按照上面的做法,时间复杂度是10的八次幂。原创 2023-03-23 23:27:24 · 104 阅读 · 0 评论 -
1626.无矛盾的最佳球队
因为st已经是排好序的,所以当选到 i 的时候,前面的同学年龄都是不大于他的,因此只要是分数比 i 小的或是年龄与 i 一致的,都可以加入到“第 i 个同学作为选出球队中年龄最大的球员”的球队中去,也就是说分数可以算到总分中。因为题目要求的是年龄较小球员的分数 严格大于 一名年龄较大的球员,则存在矛盾,所以这里我们的策略是从小到大按照年龄排序,年龄相同则按照分数从大到小排序。排好序后,设置一个dp数组,dp[i]的含义是,第 i 个同学作为选出球队中年龄最大的球员时,球队的最大总得分。原创 2023-03-23 20:39:51 · 156 阅读 · 0 评论 -
贪心和动态规划的区别
举个很简单的例子,区别就显而易见了。你有1元、2元、5元的硬币各5枚,问付款26元所需的最少硬币数量。首先贪心怎么做呢?那当然是越贪越好。从五元的拿起,拿五个,然后是2元,最后1元,需要6个。那dp应该怎么做呢?写出状态转移方程:d[0]=0,d[i]=min(d[i],d[i-vj[j]]+1)可见,贪心是贪心解决子问题得到子问题的最优解,即最优子结构,最终结果=最优子结构+剩下子问题的最优解。而dp则要通过状态转移方程一步步的根据前一步状态的结果来得到当前状态的最优解。具体代码可见另一原创 2022-04-05 00:07:13 · 242 阅读 · 0 评论 -
C. Chef Monocarp
题目:https://codeforces.com/contest/1437/problem/C题意:给出每个菜拿出的时间,当你在t秒的时候拿出了第i道菜,那这道菜的令人不愉快值为t-ai的绝对值。问你每道菜应该在什么时间拿出来能使得不愉快值最小。思路:dpdp还是很容易看出来的,至于转移方程就需要多看一会了。dp[i][j]=min(dp[i-1][j],dp[i-1][j-1]+abs(a[j]-i));dp[i][j]表示前i秒拿出了j道菜的不愉快的值。代码:#include &l原创 2020-10-28 22:55:55 · 251 阅读 · 0 评论 -
飞扬的小鸟
思路:说实话我第一反应并没有想到用Dp来写,不过DP确实好用,在这里写一下心得体会。首先,初始化所有横坐标位置上的管道上沿是m+1,这样方便我们日后搜索某个位置上是否有管道。初始话二维数组d的所有位置均为INF。用tube[x]来储存x位置管道的下沿与上沿的坐标。i从1开始到n遍历,Up和Down分别是i-1的上升与下降的高度。第一种,没有飞到顶端的情况,d[i][j] = min(d[i][j],d[i-1][j-Up]+1);d[i][j] = min(d[i][j],d[i][j-Up]+原创 2020-09-16 23:43:35 · 123 阅读 · 0 评论 -
EditDis(编辑距离模板)
int dp[1005][1005]; /*dp[i][j]表示表示A串从第0个字符开始到第i个字符和B串从第0个字符开始到第j个字符,这两个字串的编辑距离。字符串的下标从1开始。*/char a[1005],b[1005]; //a,b字符串从下标1开始 int EditDis(){ int len1 = strlen(a+1); int len2 = strlen(b+1); //初始化 for(int i=1;i<=len1;i++)原创 2020-08-07 14:49:43 · 354 阅读 · 0 评论 -
程序员的好印象
题意:给出字符串的长度n,字符串由0,1构成,让你求出子字符串的最大长度,并且这个子字符串1后面不能出现0.思路:首先范围很小,一时没头绪可以考虑直接暴力破解。用a数组记录当前位置及之前出现0的个数,b数组记录当前位置及之前出现1的个数,c数组记录字符串。然后暴力搜索每一个1作为子字符串出现的第一个1,那res就是他之前0的个数加上他之后1的个数。除了暴力的做法外,也可以使用dp。用len数组记录当前位置的最大长度是多少,len[0]=1。从第一个位置开始,如果是1,因为1可以加在任意子字符串后面,原创 2020-07-15 14:33:03 · 266 阅读 · 0 评论 -
codeforce..Sasha and a Bit of Relax
类似于前缀和的思想。。代码:#include<cstdio>#include<iostream>#include<algorithm>#include<queue>#include<map>#include<vector>#include<set>#include<string>#...原创 2020-03-25 12:33:15 · 129 阅读 · 0 评论 -
codeforce..Remove One Element
题意:可以删去一个数,找出最长的上升子序列思路:dp。用0行的dp数组记录当前位置为末尾的最大上升子序列的长度,用1行的dp数组记录当前位置为开始的最大上升子序列的长度。然后我们从前遍历一次,取当前位置为首的最大长度,加上去掉当前点前后两段加和的最大长度,取最大值,遍历之后即为答案。代码:#include<cstdio>#include<iostream>#i...原创 2020-03-25 11:10:16 · 184 阅读 · 0 评论 -
Vasya and Multisets
题意:在一个集合中只出现一次的数是nice的。给出一个集合,我们能否将其分为两个集合,每个集合的nice数的数量一样多。思路:因为每个数都是小于等于100的,所以我们开个数组b将每个数出现的次数记录下来。还要记录出现次数为1和大于等于三的数量。因为等于1的,肯定是nice,那我们一定得将它们分开在两个集合中。如果等于1的数量是偶数,我们只要将前一半的1的数分到一组,其余的数分到另一组就可以了...原创 2020-03-25 09:34:14 · 145 阅读 · 0 评论 -
codeforce.. WOW Factor
题意:给出一串字符,vv算作一个w,问字符串中包含wow的个数。思路:最开始只想求出所有w的字段长度,在求出所有o的字段长度,再分别加和乘就可以了。不过工作量大不说,还很容易漏判和错判很多情况。后来想到了线性时间解决的办法。用s记wow的总数,l记vv的总数,t来记录所有出现过的vvo的数量。每次遇到o,wo的数量就是之前的wo数量加上之前vv的数量。代码:#include<cst...原创 2020-03-25 09:09:02 · 237 阅读 · 0 评论 -
codeforce. Vitamins
题意:想要得到ABC,所需要的最小花费是多少。思路:由于给出的是ABC,又有不用类型的搭配,与二进制很相似,所以我们用二进制来表示。每次计算得到当前二进制数的最优解。代码:#include<cstdio>#include<iostream>#include<algorithm>#include<queue>#include<m...原创 2020-03-24 20:43:17 · 144 阅读 · 0 评论 -
codeforce. Just Eat It!
题意:如果有[l,r]这一段的和比数组总和大,就是NO,否则就是YES思路:就一段一段判断就可以。如果加和之后比a[i]还小,那就从a[i]从新开始计数。从一开始之后还要从2开始一遍,因为从一开始的,无法忽略不存在1的这种情况。代码:#include<bits/stdc++.h>using namespace std;long long n,k,t,mod=1e9+7,s...原创 2020-03-24 09:54:18 · 117 阅读 · 0 评论 -
P1057 传球游戏
题目描述上体育课的时候,小蛮的老师经常带着同学们一起做游戏。这次,老师带着同学们一起做传球游戏。游戏规则是这样的:nn个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没有传出去的那个同学就是败者,要给大家表演一个节目。聪明的小蛮提出一个有趣的问题:有多少种不同的传球...原创 2019-11-21 19:19:52 · 150 阅读 · 0 评论 -
小A买菜
题目背景uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种。uim指着墙上的价目表(太低级了没有菜单),说:“随便点”。题目描述不过uim由于买了一些辅(e)辅(ro)书,口袋里只剩MM元(M≤10000)。餐馆虽低端,但是菜品种类不少,有N种(N≤100),第i种卖ai元(ai ≤1000)。由于是很低端的餐馆,所以每种菜只有一份。小A奉行“不把钱...原创 2019-10-16 20:07:29 · 137 阅读 · 0 评论 -
斐波那契数列的dp算法
Fibbonacci NumberYour objective for this question is to develop a program which will generate a fibbonacci number. The fibbonacci function is defined as such:f(0) = 0f(1) = 1f(n) = f(n-1) + f(n-2)...原创 2019-04-21 11:34:36 · 1891 阅读 · 0 评论 -
命运
穿过幽谷意味着离大魔王lemon已经无限接近了!可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关。要知道,不论何人,若在迷宫中被困1小时以上,则必死无疑!可怜的yifenfei为了去救MM,义无返顾地跳进了迷宫。让我们一起帮帮执着的他吧!命运大迷宫可以看成是一个两维的方格阵列,如下图所示:yifenfei一开始在左上角,目的...原创 2019-04-21 16:23:31 · 133 阅读 · 0 评论 -
Longest Ordered Subsequence
A numeric sequence of ai is ordered if a1 < a2 < … < aN. Let the subsequence of the given numeric sequence ( a1, a2, …, aN) be any sequence ( ai1, ai2, …, aiK), where 1 <= i1 < i2 < ...原创 2019-04-24 18:20:08 · 208 阅读 · 0 评论 -
Vanya and Treasure(dp进阶)
A - Vanya and TreasureVanya is in the palace that can be represented as a grid n × m. Each room contains a single chest, an the room located in the i-th row and j-th columns contains the chest of typ...原创 2019-05-05 13:16:01 · 225 阅读 · 0 评论 -
背包问题
1.采药题目描述辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”如...原创 2019-10-06 21:29:32 · 398 阅读 · 0 评论 -
红牌
题目描述某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂 ,一共包括NN个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程,每一步政府都派了MM个工作人员来检查材料。不幸的是,并不是每一个工作人员效率都很高。尽管如此,为了体现“公开政府”的政策,政府部门把每一个工作人员的处理一个申请所花天数都对外界公开。为了防止所有申请人都到效率高的...原创 2019-10-10 20:25:34 · 268 阅读 · 0 评论 -
传纸条
题目描述小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个mm行nn列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1(1,1),小轩坐在矩阵的右下角,坐标(m,n)(m,n)。从小渊传到小轩的纸条只可以向下或者向右...原创 2019-10-11 18:12:47 · 196 阅读 · 0 评论 -
Bone Collector
Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave …The bone collector ...原创 2019-04-21 10:54:09 · 154 阅读 · 0 评论