
dp
璇玑你没有心
这个作者很懒,什么都没留下…
展开
-
P2432 zxbsmk爱查错 (dp)
原题链接:zxbsmk爱查错 - 洛谷思路:求的是最少需要剔除的字母数,按照dp的思想:f[i]:字符串从1到i变成合法句子最少需要剔除的字母数如果字符串长度是n,有m个单词,那么对于i,每次都从后往前与每一个单词进行匹配,并且找到与这个单词最近匹配完的位置(如果能匹配完就可以转移,不能匹配就转移不了),并进行状态转移。注意:1)先考虑把s[i]删掉的情况,f[i] = f[i - 1] + 1; 2)然后再考虑与每个单词一一配对的情况:如果...原创 2022-05-10 21:05:53 · 230 阅读 · 0 评论 -
P1868 饥饿的奶牛 (线性dp)
原题链接:饥饿的奶牛 - 洛谷思路:选择不重合的区间让区间点数最多,我想到了把每个区间左右端从小到大排序然后写dp,但是又有问题了,如果中间有一段是空着的那递归的时候f[i]就很难从f[i - len]转移过去,而且就算排了左端点的顺序,但是还是觉得顺序很乱,因为右端点也不确定...所以其实就找到最大的端点mmax,然后从0开始顺着找到mmax,每次先f[i] = f[i - 1],如果对于一个端点,它是一个右端点,那么它就有机会从它的左端点转移过来。所以用一个vector把所有右端点的左端点..原创 2022-05-10 20:49:51 · 516 阅读 · 0 评论 -
P2380 狗哥采矿 (二维dp)
原题链接:狗哥采矿 - 洛谷思路:我一开始想的是,一个点往左走还是往上走与它上面和左边的点走的方向有关系,但是感觉复杂交错.....然后看到了大佬的二维dp,其实Aij往左走,就让它左边的这一条都往左走然后加上这些值;Aij往上走,就让它上面的点都往上走,然后加上这些值...我确实没太想到用二维前缀和这样的递推..还是要多做题多思考!AC代码:#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define ll long ...原创 2022-05-10 20:35:06 · 286 阅读 · 0 评论 -
P1613 跑路(dp + Floyd)
原题链接:跑路 - 洛谷参考:题解 P1613 【跑路】 - Hydra_ 的博客 - 洛谷博客大佬代码注释写的很详细了,没看明白底下我写的代码的可以去看看大佬写的其实能这么写还有一个条件,就是你看,它的每一条边的长度都是1,所以用倍增。想想看,如果一条边是1,一条边是3,1 + 3是2的2次方,但是如果找的是2^(k - 1)和2^(k - 1),结果就会不对了。所以还是要明白一下题目为什么可以这样用倍增的思想~另:maxlongint不知道是啥,就看成long long开2^6...原创 2022-05-10 20:27:33 · 311 阅读 · 0 评论 -
P4677 山区建小学 (dp)
原题链接:山区建小学 - 洛谷思路:参考:题解 P4677 【山区建小学】 - hsfzLZH1 的博客 - 洛谷博客注意:1) 细节方面格外要注意,初始化要注意,这个题如果 dp[i][0]当i不为0的时候会有问题,因为不会存在前面i个村庄都没有学校(相当于前面距离和为0)然后后面的村庄有学校的情况;2)而且题目给的是n - 1个距离,可以先设a[1] = 0,然后依次得到a[i]的坐标(相当于坐标)AC代码:#include<bits/stdc++..原创 2022-05-08 12:13:50 · 520 阅读 · 0 评论 -
P1799 数列(删数dp)
原题链接:数列 - 洛谷还是dp,还是好难呜呜~看看大佬题解叭:题解 P1799 【数列】 - muyang_233 的博客 - 洛谷博客AC代码:#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define ll long long#define PII pair<int,int>#define rep(i, n) for (int i = 1; i <= (n); ++i)#define r..原创 2022-05-07 11:24:16 · 359 阅读 · 0 评论 -
P1537 弹珠 (多重背包)
原题链接:弹珠 - 洛谷看一个人能不能凑出sum / 2就可以了多重背包AC代码:#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define ll long long#define PII pair<int,int>#define rep(i, n) for (int i = 1; i <= (n); ++i)#define rrep(i, n) for(int i = n; i >= 1; ++.原创 2022-05-06 19:50:21 · 298 阅读 · 0 评论 -
P1651 塔 (dp)
原题链接:塔 - 洛谷思路:int f[N][M]; //已经分配了第i个积木的时候高度差为j的两个塔中高的那个的高度四种情况:1.a[i]哪边都不放,高的塔最高值不变2.a[i]放在矮的塔而且最后矮的塔还是矮的塔,高的塔值不变3.a[i]放在高的塔,高的塔更高了,高的塔值加a[i]4.a[i]放在矮的塔,矮的塔增加了a[i]之后比高的塔高了,这时高的塔的那个值要改变,加j注意:1)我们每次的j值都是高的减矮的差值,即我们不会让j值成为负数,所以四种情况得判断j与.原创 2022-05-06 14:22:38 · 225 阅读 · 0 评论 -
P1284 三角形牧场 (dp 背包)
原题链接:三角形牧场 - 洛谷可以先看看大佬这个思路,写的非常清楚:P1284 三角形牧场 - Cxs3 - 洛谷博客然后再看我写的这些要注意的地方:思路:这个题不是直接用dp解决,而是先用dp判断三条边的长度是否可以由题目给的木板长度凑成(背包),然后再枚举每条边的长度,求取最大值。注意:1.因为每个木板都要用到,所以sum是确定的,那么其实知道了两条边,第三条边的长度也是可以知道的,所以只用对两条边的长度进行dp就行了。dp的时候先不管每条边是不是合法,只要能...原创 2022-05-05 19:39:11 · 399 阅读 · 0 评论 -
P2132 小Z的队伍排列 (dp)
原题链接:小Z的队伍排列 - 洛谷思路:我们可以考虑到,如果我们按从高到矮的顺序把每个人插入到一排之中,后面一排已经加入的数量一定是大于等于前面一排的而且加入到一排的时候一定是加入到队尾的,这样才能满足排头最高的条件。所以就按照顺序来,用dp来解决。我之前有点想不清楚,为什么每次只用判断相邻两排的大小关系就行了,之后发现因为abcde都是在枚举,很多量是用不到的,其实不太用管吧。AC代码:#include <iostream>using namespace s..原创 2022-05-05 13:34:17 · 721 阅读 · 0 评论 -
P1622 释放囚犯 (区间dp)
原题链接:释放囚犯 - 洛谷思路:反着考虑其实就是区间dp,类似石子合并问题,不同点是每次合并的时候记得把断点的个数加上而且要减去一个断点(每次合并的时候都是一个断点的两边进行合并)注意初始化其实就是len为1的时候即f[i][i] = 0(对单独一堆石子的操作代价为0)。AC代码:#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define ll long long#define PII pair<i...原创 2022-05-05 09:12:45 · 285 阅读 · 0 评论 -
P2112 鸿雁传书(dp)
原题链接:鸿雁传书 - 洛谷 我不知道这叫背包问题还是区间dp.. 反正就是顺着来,然后像往常一样的套路。有时候初始化会有点不同还是咋的,记得多想想多试试。注意初始化注意初始化 !AC代码:#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define ll long long#define PII pair<int,int>#define rep(i, n) for (int i = 1; ...原创 2022-05-04 19:41:01 · 254 阅读 · 0 评论 -
E. Pchelyonok and Segments(cf)dp
原题链接:Problem - E - Codeforces每日一遍,dp鲨我~思路晚上复习补AC代码:#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef pair<int, int> PII;const double pi = acos(-1.0);#define rep(i, n) for (int i = 1; i <= (n); ++i)#def..原创 2022-04-13 23:49:39 · 335 阅读 · 0 评论 -
B. Catching Cheaters(cf)dp
原题链接:Problem - 1446B - Codeforces题目大意:给你两个字符串A,B,让你分别从A,B中截取子串(连续)C,D,然后这两个串的最长公共子序列长度是LCS(C,D),让你找到最大的4⋅LCS(C,D)−|C|−|D|的值。思路:这其实是最长公共子序列的变形呜呜我自己还是想不到~dp[i][j]表示以a[i]结尾b[j]结尾的子串C,D能使4⋅LCS(C,D)−|C|−|D|为最大值的值。如果a[i] == b[j],那么就由前面的dp[i -1][j -..原创 2022-04-03 18:52:08 · 571 阅读 · 0 评论 -
D. Distance in Tree(cf)树状dp
原题链接:Problem - 161D - Codeforces题意:很简单,问你在树中有几对点之间的距离是k解法:树状dp,从叶子节点往父节点开始推。每个父节点它的不同的子树,每次加进来一个子树就乘一遍,然后更新值,下次再乘(我说不清楚..下次画个图)呜呜dp都好难AC代码:#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef pair<int, int> PII原创 2022-03-30 20:26:07 · 337 阅读 · 0 评论 -
小沙的remake(牛客)排序+ 树状数组 + dp
原题链接:登录—专业IT笔试面试备考平台_牛客网把a[i]先排序(带着下标排),然后从小到大每次先找下标在范围之内 [ i − b i , i ) 的所有种数,然后加一就是以a[i]为最后一个元素的所有种数。因为数据可能会很大,每次更新树状数组中的值的时候记得取模。如果有相减的时候,记得要加mod再取模。AC代码:#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef pair<原创 2022-03-29 18:52:40 · 1909 阅读 · 0 评论 -
过桥(牛客)(逆推dp)
原题链接:登录—专业IT笔试面试备考平台_牛客网思路:其实如果走到一个a[i]是负数的地方,也就是要倒退,这样是没有用的。因为如果说前面还有a[i]大于0,我倒退回去了然后下一步能走到更远的地方,但是这样用的步数比之前就在那个地方的步数要多啊。所以说如果a[i]< 0,对答案是没有贡献的。我把没有贡献地方dp的时候设置为-1,那么下次碰到就直接跳过。n不大,双重循环能过。看了大佬思路我自己写的代码:#include<bits/stdc++.h>u..原创 2022-03-05 16:50:10 · 381 阅读 · 0 评论 -
跳跳跳(牛客) (环形)区间dp
原题链接:登录—专业IT笔试面试备考平台_牛客网1.之前理解错题意了,我以为每次只能走离自己最近且没有走过的地方,那么一旦选择了方向就可以一直往那边走下去了。但是并不是这样,比如它右边有一个位置选过了,那就可以选右边第一个没有选过的位置,是这个意思。所以它其实是每次往左或往右扩展,形成的是一个区间。而最后我们也可以把所有结束时的区间端点(一定是相邻的)求出他们之中的最大值。1/ 2, 2/3..n /1这样都会是候选答案;2.这是一个环形区间dp问题,所以开数组开到2 * n,并且有:.原创 2022-03-05 15:55:23 · 541 阅读 · 0 评论 -
E. Tetrahedron(cf)dp
原题链接;Problem - 166E - Codeforces题目大意:一个四面体,初始点在D,问你走n步回到D的方案数。思路:其实想一下,A、B、C每次的状态都是一样的,走到它们的方案数总是相同的,D与它们稍有不同,所以分两类,一个a,一个d;a[i]表示走i步能到A/B/C的种数d[i]表示走i步能到D的种数所以有:a[i] = (2 * a[i - 1] + d[i - 1]) % M;d[i] = (3 * a[i - 1]) % M;AC代码:#incl原创 2022-03-04 00:15:03 · 155 阅读 · 0 评论 -
C. Ayoub and Lost Array(cf)dp
原题链接:Problem - 1105C - Codeforces题目大意:给你三个数n, l, r,让你从l到r之中(包含l、r)选择n个数(可以重复)让n个数的和可以被3整除的方案数。思路:1.其实把所有数转换成关于除以3的余数,就可以把众多数变成三个类型了;2.找到所有l到r之间对3取余为0, 1, 2的数的个数,数量分别是a0,a1,a2。注意求的时候如果直接遍历会超时,其实想想看,可以很容易求: a0 = r / 3 - (l - 1) / 3; ...原创 2022-03-03 23:56:09 · 179 阅读 · 0 评论 -
C. Sweets Eating(cf)dp
原题链接:Problem - 1253C - Codeforces题目大意: 糖果每天最多吃m个,一共n个糖果。糖果第d天吃的花费是a[i] * d 问你吃k块糖果的最小花费是多少。思路:先把每颗糖果的a[i]排序,例如1 2 3 4 5..比如m为3,一天最多吃三颗糖。那么如果要吃1颗糖,当然选择最少的,而且在第一天吃,花费就是1;如果2颗,2 <= 3,都在第一天吃,所以1 + 2 = 3..如果4颗,肯定让4 3 2在第一天吃,1 在第二天吃,那么答案就是4 +3 + 2 + 1 * .原创 2022-03-02 17:07:27 · 197 阅读 · 0 评论 -
D. Remove One Element(cf)dp
原题链接:Problem - 1272D - Codeforces题目大意:给你n个数,求最长连续严格增加的子序列。当然,你可以总共删除一个数或者不删,但是有可能删除一个数之后答案会增加。先前想的是看每个数取与不取,但是发现一个问题,整个数列最多只能删除一个数。其实想想看, 如果a[i] < a[i + 2],a[i +1]可能会有阻挡也可能没有,可能删除了之后会更新答案,所以可以取原先所有连续递增的最长子序列长度,然后从前往后遍历,如果a[i] < a[i + 2],res = m.原创 2022-03-02 10:00:59 · 205 阅读 · 0 评论 -
D. a-Good String(cf)分治 + 递归
原题链接:Problem - 1385D - Codeforces题意:给你一个由小写拉丁字母组成的字符串s[1…n]。对于某个k≥0的整数,保证n=2^k。如果满足以下三个条件中的至少一个,则字符串s[1…n]称为c-good:s的长度为1,由字符c组成(即s1=c);s的长度大于1,字符串的前半部分只包含字符c(即s1=s2=⋯=sn2=c),而字符串的后半部分(即字符串sn2+1sn2+2…sn)是(c+1)-好字符串;s的长度大于1,字符串的后半部分只包含字符c(即sn2+1=sn2+.原创 2022-03-02 09:28:54 · 249 阅读 · 0 评论 -
C. Mortal Kombat Tower(cf)dp
原题链接:Problem - 1418C - Codeforces题目大意: 有一个序列n个数,非0即1,有两个人,一个是你的朋友,一个是你。从左到右,从你的朋友先开始,每个人一次必须选一个或两个数。ta选完你选然后又是ta选...问你朋友最后得到数的最小值。1.其实就是让你的朋友尽量得到更少的1,得到更多的0;2.用0表示你朋友,1表示你自己。状态转移:用dp[i][0]表示打的第i个怪,且是你朋友打完的。dp[i][1]表示打的第i个怪,且是你打完的。2.状态转移方程://如果朋.原创 2022-03-01 16:55:21 · 159 阅读 · 0 评论 -
最长公共子序列(洛谷)dp
这个与一般求LCS 不太相同,因为N太大, 先前学的是O(n*n),rep(i, n) rep(j, n):现在N会到1e5,肯定会爆,那可以怎么优化呢?1.把a数组每个数出现的顺序当做新编号放在num[]数组里,那么b数组就可以随之改变。即a数组变成1 2 3 4 5, 那么b可以相应变成3 2 1 4 5, 那么最长公共子序列显然就变成了求b数组的最长上升子序列。而最长上升子序列又可以用单调队列和二分优化;2.单调队列:每次找到第一个大于等于b[i]的值的位置与b[i]替换...原创 2022-02-27 16:35:42 · 423 阅读 · 0 评论 -
B. The Number of Products(cf)dp
原题链接:Problem - 1215B - Codeforces题目大意:给你n个数,有正有负但是没有为0的,让你求出所有的l <= r的连续区间的al * al + 1 * ...*ar为负数和整数的区间总数分别是多少。1.其实就看负数的个数是奇数还是偶数就可以了,但是我一开始是前缀和然后两重循环,当然超时了。之后看了网上的博客,有一个写的好好,还是我太菜了;2.dp[i]表示以i下标结尾的区间的个数,dp[i][0]表示以i为右端点的负数区间的个数,dp[i][1]表示以i为.原创 2022-02-27 15:17:19 · 174 阅读 · 0 评论 -
B. Mashmokh and ACM(cf)dp
原题链接:Problem - 414B - Codeforces题目大意:给出两个数n,k,可以取1~n中的数,组成长度为k的数组,数组满足a1 <= a2 <= ..<= ak,且相邻两数满足前面这个数可以除尽后面那个数ai +1 % ai == 0.问你有多少种情况。一开始我想的是完全背包,因为1~n中的数可以用不止一次,但是限制是个数,我又觉得无从下手了。参考了其他大佬的代码,最后总结出来:可以令数组dp【i】【z】//i表示当前数组长度,z表示以z值作为最后一个数的情原创 2022-02-27 12:31:25 · 190 阅读 · 0 评论 -
C. Three displays(cf)dp
原题链接:Problem - 987C - Codeforces题目大意:给你n个数a1,a2...an还有与其分别对应的b1,b2..bn。求所有的满足i < j < k,a[i] < a[j] < a[k]的三个数的b[i] + b[j] + b[k]的最小值。方法一:用两个dp:第一个dp得到所有可以作为第二个数的值(a[i] +a[j]),并放到bb[]数组中,当然如果这个数不能作为第二个数,bb[]此时为INF;第二个dp直接设res = INF,然后原创 2022-02-27 11:16:52 · 253 阅读 · 0 评论 -
石子合并(AcWing)区间dp
区间dp模板:一维区间长度,二维每次从左端点i为1取起,右端点j为i + len - 1每一步详解都在代码注释中:#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3f#define ios ios::sync_with_stdio(false);cin.tie(0); cout.tie(0);typedef pair<int, int> PII;const double p...原创 2022-02-26 16:59:30 · 157 阅读 · 0 评论 -
B. Find the Spruce(cf) dp
题目大意:就是找有多少个图上的这些图形其实可以从下往上看,如果这个点是‘*’,它本身就是一个;如果它的下方,下方左边,下方右边都是‘*’,那么又要加...想想看第三个图是不是应该是dp[i][j] += min(dp[i][j], dp[i +1][j - 1], dp[i +1][j + 1]),当然初始应该吧所有是‘*’地方的dp[i][j]设为1,'.'的dp[i][j]设为0。#include<bits/stdc++.h>using namespace std;#...原创 2022-02-25 19:44:05 · 148 阅读 · 0 评论 -
C. Unstable String(cf) dp
原题链接:Problem - 1535C - Codeforces题目大意:有t 组询问,每次给定一个仅包含字符 1或 0或 ?的字符串 s ss。定义一个子串是不稳定的当且仅当子串中任意相邻两数均不相同,如 101010…101010… 或 010101…010101…。其中 ? 可以变为 1或 0其中一种。请求出给定的 s ss 中最多可以有的不稳定子串个数。注意:1.??是一个符合的子串而不是两个,因为它有情况可以满足beautiful串(01/10),但是并不是算2个,只...原创 2022-02-25 15:40:09 · 462 阅读 · 0 评论 -
B. Orac and Models(cf)dp
原题链接:Problem - 1350B - Codeforces题意:求一个下标单调递增且互为倍数,即满足j > i且j为i的倍数,并且s[i] < s[j]的最长子序列。其实和最长上升子序列很像,只是这个是要枚举能整除i的数然后状态转移:状态转移方程: f[j] = max(f[j], f[i] + 1);#include<bits/stdc++.h>using namespace std;#define INF 0x3f3f3f3ftypedef原创 2022-02-25 14:29:30 · 559 阅读 · 0 评论 -
I 爆炸的符卡洋洋洒洒(牛客)01背包
输入2 21 22 1输出1说明选择第二个符卡,消耗为2,是2的倍数。威力是1。输入2 21 22 1输出1说明选择第二个符卡,消耗为2,是2的倍数。威力是1。输入3 41 25 31 4输出-1说明显然,无论如何都组合不出消耗为4的倍数的魔法。这不是一般的01背包(虽然一般的01背包我也不会呜呜呜)官方题解:#include<bits/stdc++.h>using namespace std;#defi...原创 2022-02-21 18:58:00 · 294 阅读 · 0 评论